목차
Git은웨어 하우스를 생성 할 때 현재웨어 하우스 디렉터리에 .git이라는 숨겨진 디렉터리를 생성하여웨어 하우스 구성 및 데이터 정보를 저장합니다. 이 기사에서는 예제와 함께 Git 저장소의 기본 디렉토리를 소개합니다.
1. 예제 환경
다음 예제는 모두 다음 환경에서 수행됩니다.
시스템 환경 : CentOS Linux 릴리스 7.6.1810 (코어)
git 버전 : git 버전 1.8.3.1
원격웨어 하우스 : GitHub.
둘째, 디렉토리 구조
git init 명령을 사용하여웨어 하우스를 초기화합니다. 초기 디렉토리 (.git) 구조는 다음과 같습니다.
[root@192 testgit]# tree .git
.git
├── branches
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ └── update.sample
├── info
│ └── exclude
├── objects
│ ├── info
│ └── pack
└── refs
├── heads
└── tags
9 directories, 13 files
[root@192 testgit]#
이 초기화 된웨어 하우스는 dev-branch 브랜치가 생성되고 푸시 될 때 디렉토리 구조는 다음과 같습니다.
[root@192 testgit]# tree .git/
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ └── update.sample
├── index
├── info
│ └── exclude
├── logs
│ ├── HEAD
│ └── refs
│ ├── heads
│ │ ├── dev-branch
│ │ └── master
│ └── remotes
│ └── origin
│ └── master
├── objects
│ ├── 2d
│ │ └── d2c71b69c837a7459f4bd9c9f7db6520731d06
│ ├── 5c
│ │ └── 7b8eda18a75e13d27c31e65a54b0abd7948510
│ ├── 77
│ │ └── cad3aecf7c2754231095598119979d62a1e1da
│ ├── info
│ └── pack
└── refs
├── heads
│ ├── dev-branch
│ └── master
├── remotes
│ └── origin
│ └── master
└── tags
19 directories, 25 files
[root@192 testgit]#
다음으로 각 디렉토리와 파일에 대해 자세히 소개합니다.
2.1 브랜치 디렉토리
기본적으로 현재 사용되지 않는 git fetch, git pull 및 git push의 URL을 지정하는 데 사용되는 드물게 스토리지 속기 방법입니다.
2.2 COMMIT_EDITMSG 파일
대문자를 소문자로 변경하면 이해하기 쉽습니다. commit_editmsg : commit edit information, only record the latest commit edit information, for example :
[root@192 testgit]# vim README
[root@192 testgit]# git add .
[root@192 testgit]# git commit -m "modify README file"
[master 2392c4d] modify README file
1 file changed, 2 insertions(+), 1 deletion(-)
[root@192 testgit]# git push origin master
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 315 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:New-World-2019/testgit.git
3cbe67c..2392c4d master -> master
[root@192 testgit]# cat .git/COMMIT_EDITMSG
modify README file
[root@192 testgit]#
위의 예에서 먼저 README 파일을 수정 한 다음 원격으로 푸시하고 커밋 할 때 "modify README file"을 작성한 다음 COMMIT_EDITMSG 파일을보고 제출할 때 비고를 저장합니다.
2.3 구성 파일
이름을보고 현재 창고의 구성 정보를 저장하기 만하면됩니다. git 구성 파일은 다음과 같은 세 계층으로 나뉩니다.
- / etc / gitconfig 파일 : 각 사용자 및 해당웨어 하우스의 시스템 일반 구성;
- ~ / .gitconfig 또는 ~ / .config / git / config 파일 : 현재 사용자 의웨어 하우스 구성.
- .git / config 파일 (현재웨어 하우스 아래) : 현재 사용자의 현재웨어 하우스 구성
최하위 계층이 가장 높은 우선 순위를 가지며 상위 계층 구성 정보를 덮어 씁니다. 위 파일은 git config 매개 변수를 통해 수정할 수 있습니다. 구성 가능한 정보에는 사용자 정보, http 정보, 창고 정보 등이 포함됩니다.
[root@192 testgit]# cat ~/.gitconfig
[user]
name = New-World-2019
email = [email protected]
[http]
postBuffer = 1048576000
lowSpeedLimit = 0
lowSpeedTime = 999999
[root@192 testgit]# cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = [email protected]:New-World-2019/testgit.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[branch "dev-branch"]
remote = origin
merge = refs/heads/dev-branch
[root@192 testgit]# git config --list
user.name=New-World-2019
[email protected]
http.postbuffer=1048576000
http.lowspeedlimit=0
http.lowspeedtime=999999
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
[email protected]:New-World-2019/testgit.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.dev-branch.remote=origin
branch.dev-branch.merge=refs/heads/dev-branch
[root@192 testgit]#
위의 예에서 / etc / gitconfig 파일이 시스템에 생성되지 않은 경우 인쇄되지 않습니다. 현재웨어 하우스에서 git config --list 명령의 결과가 ~ / .gitconfig 및 .git / config 파일의 합계임을 알 수 있습니다. 더 많은 구성 정보가 필요한 경우 git config 명령을 통해 자세히 알아볼 수 있습니다.
2.4 설명 파일
GitWeb에서 프로젝트 설명 정보를 표시하는 데 사용됩니다. 기본 콘텐츠는 다음과 같습니다.
Unnamed repository; edit this file 'description' to name the repository.
2.5 HEAD 파일
현재 분기를 가리 키도록 HEAD 포인터를 저장합니다. 즉, 현재 활성 분기를 기록합니다. 예를 들면 다음과 같습니다.
[root@localhost testgit]# git status
# 位于分支 master
无文件要提交,干净的工作区
[root@localhost testgit]# cat .git/HEAD
ref: refs/heads/master
[root@localhost testgit]# git checkout dev-branch
切换到分支 'dev-branch'
[root@localhost testgit]# cat .git/HEAD
ref: refs/heads/dev-branch
[root@localhost testgit]#
위의 예에서는 마스터 브랜치에서 시작했는데 dev-branch 브랜치로 전환 한 후 .git / HEAD 파일의 내용은 refs / heads / dev-branch가됩니다.
2.6 후크 디렉토리
디렉터리에는 많은 후크 파일 (일부 스크립트)이 저장되어 있습니다. 이러한 파일은 다양한 Git 명령에서 사용되는 사용자 지정 스크립트이며 commit, rebase, pull) 작업 전후와 같은 Git의 특정 단계에서 자동으로 실행될 수 있습니다. 일부 샘플 후크는 git init를 실행할 때 설치되지만 기본적으로 모두 비활성화되어 있습니다. 활성화하려면 파일 .sample 접미사를 삭제해야합니다.
2.7 색인 파일
임시 저장 영역 (스테이지), 바이너리 파일.
2.8 정보 디렉토리
저장소의 다른 정보는이 디렉토리에 기록됩니다.
info / exclude : .gitignore와 유사한 지정된 모드의 파일을 무시하지만 .gitignore는 각 디렉토리에 따라 다릅니다.
2.9 로그 디렉토리
업데이트 된 모든 참조 레코드를 저장합니다. 디렉토리 구조는 다음과 같습니다.
[root@localhost logs]# tree
.
├── HEAD
└── refs
├── heads
│ ├── dev-branch
│ └── master
└── remotes
└── origin
├── dev-branch
└── master
4 directories, 5 files
[root@localhost logs]#
이 중 HEAD는 분기 전환을 포함한 모든 변경 기록을 기록하고, 로컬 및 원격 분기의 변경 기록을 logs / refs 아래에 저장합니다.
2.10 개체 디렉터리
Git은 콘텐츠 주소 지정이 가능한 파일 시스템입니다. Git의 핵심 부분은 간단한 키-값 데이터 저장소입니다. 모든 유형의 콘텐츠를 Git 저장소에 삽입 할 수 있으며 언제든지 콘텐츠를 다시 검색 할 수있는 고유 키를 반환합니다.
간단히 이해하면 객체 디렉토리는 Git 데이터베이스 (map [key] = value의 형태로 상상할 수있는 키-값 쌍 데이터베이스)입니다. 콘텐츠는 키에 따라 액세스되고 키는 SHA1에 의해 계산 된 값. 이 디렉터리에는 데이터 개체 (blob 개체), 트리 개체 (트리 개체) 및 커밋 개체 (커밋 개체)의 세 가지 종류의 개체 (최대)가 저장됩니다.
(1) 정보 및 팩 디렉토리
저장된 파일이 매우 클 때 git은 파일을 압축하여 info 및 pack 아래에 저장합니다.
(2) 2 문자 명령어 디렉토리
첫째,이 두 글자는 계산 된 SHA1 값의 처음 두 글자 (총 40 자)이고 나머지 38자는 디렉터리의 파일 이름입니다.
2.11 refs 디렉토리
(1) 헤드 디렉토리
디렉토리에는 각 로컬 브랜치 이름을 따서 명명 된 파일 이 포함되어 있으며 해당 브랜치의 최근 제출 된 ID (SHA1 알고리즘에 의해 계산 된 문자열)가 저장됩니다.
(2) 원격 디렉토리
디렉토리에는 각 원격 지점 이름을 따서 명명 된 파일 이 포함되어 있으며 해당 지점의 최근 제출 ID 및 heads 디렉토리의 원칙을 저장합니다.
(3) 태그 디렉토리
개발 과정에서 만들어진 태그를 저장하고, 내부 파일은 태그 이름으로 명령하고 파일의 내용은 해당 ID입니다.
3. 참고 문헌
[2] gitignore
[3] 자식 가지