git bundle create
Одним из методов является использование внешнего хранилища для обмена данными между репозиториями - это git bundle . Таким образом, у вас есть только отдельные файлы для каждой передачи, а не промежуточные репозитории 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
иначе пакеты будут больше, чем могли бы быть.