git bundle create
Eine der Methoden besteht darin, externen Speicher zum Austausch von Daten zwischen Repositorys zu verwenden. Dies ist ein Git-Bundle . Auf diese Weise haben Sie nur einzelne Dateien für jede Übertragung, keine Git-Zwischenablagen.
Jeder "Git Push" verwandelt sich in die Erstellung einer Datei, "Git Fetch" holt Dinge aus dieser Datei.
Demo-Sitzung
Erstellen des ersten Repositorys und Ausführen des ersten "Push"
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)
"Klonen" in das zweite Repository (dh den zweiten Computer):
gitbundletest$ git clone /tmp/1.bundle repo2
Cloning into 'repo2'...
Receiving objects: 100% (3/3), done.
gitbundletest$ cd repo2/
repo2$ cat 1
1
Einige Änderungen vornehmen und in eine andere Bundle-Datei "verschieben":
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)
Änderungen in das erste Repository "ziehen":
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
Im Gegensatz zum ersten Bundle enthält das zweite nur einen Teil der Git-History und ist nicht direkt klonbar:
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
Die Verwendung von Bundles hat den Nachteil, dass Sie manuell angeben müssen, welchen Bereich von Commits jedes Bundle enthalten soll. Im Gegensatz zu git push
, git bundle
zu verfolgen , was in früherem Bündel war nicht, müssen Sie manuell einstellen refs/remotes/origin/master
oder Bündel würde größer sein , als es sein könnte.