git bundle create
방법 중 하나는 외부 저장소를 사용하여 리포지토리간에 데이터를 교환하는 것입니다 .git 번들 입니다. 이렇게하면 중간 Git 리포지토리가 아닌 각 전송마다 단일 파일 만 있습니다.
각 "git push"는 파일 생성으로 바뀌고 "git fetch"는 해당 파일에서 항목을 가져옵니다.
데모 세션
첫 번째 저장소 작성 및 첫 번째 "푸시"수행
gitbundletest$ mkdir repo1
gitbundletest$ cd repo1
repo1$ git init
Initialized empty Git repository in /tmp/gitbundletest/repo1/.git/
repo1$ echo 1 > 1 && git add 1 && git commit -m 1
[master (root-commit) c8b9ff9] 1
1 file changed, 1 insertion(+)
create mode 100644 1
repo1$ git bundle create /tmp/1.bundle master HEAD
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 384 bytes | 384.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
두 번째 저장소 (예 : 두 번째 컴퓨터)에 "복제":
gitbundletest$ git clone /tmp/1.bundle repo2
Cloning into 'repo2'...
Receiving objects: 100% (3/3), done.
gitbundletest$ cd repo2/
repo2$ cat 1
1
일부 변경 사항을 수행하여 다른 번들 파일로 "푸시"하십시오.
repo2$ echo 2 > 1 && git add 1 && git commit -m 2
[master 250d387] 2
1 file changed, 1 insertion(+), 1 deletion(-)
repo2$ git bundle create /tmp/2.bundle origin/master..master origin/HEAD..HEAD
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 415 bytes | 415.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
첫 번째 저장소에 대한 "풀링"변경 사항 :
repo2$ cd ../repo1
repo1$ git pull /tmp/2.bundle
Receiving objects: 100% (3/3), done.
From /tmp/2.bundle
* branch HEAD -> FETCH_HEAD
Updating c8b9ff9..250d387
Fast-forward
1 | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
repo1$ cat 1
2
첫 번째 번들과 달리 두 번째 번들에는 부분 Git 히스토리 만 포함되며 직접 복제 할 수 없습니다.
repo1$ cd ..
gitbundletest$ git clone /tmp/2.bundle repo3
Cloning into 'repo3'...
error: Repository lacks these prerequisite commits:
error: c8b9ff94942039469fa1937f6d38d85e0e39893a
fatal: bad object 250d38747656401e15eca289a27024c61e63ed68
fatal: remote did not send all necessary objects
번들을 사용할 경우 각 번들에 포함 할 커밋 범위를 수동으로 지정해야하는 단점이 있습니다. 달리 git push
, git bundle
이전 번들에 무엇을 추적하지 않습니다, 당신은 수동으로 조정해야 refs/remotes/origin/master
하거나 번들이 될 수있는 것보다 더 큰 것입니다.