git bundle: двусторонняя синхронизация всех веток между локальным и удаленным репо
Машина A имеет подключение к Интернету, а машина B - нет. Оба имеют локальный репозиторий, и машина A может взаимодействовать с Github. Разработка происходит на обеих машинах. git-bundle используется для синхронизации репозиториев.
Обычный поток синхронизации:
Создайте связку всех ветвей в B и перенесите связку в A.
Хранилище клонов github на A. Вытяните все ветви из связки в репозиторий, клонированный из github. Вставьте обновленный репозиторий (все ветви) в github.
Создайте связку всех веток из репозитория github. Перенесите связку в B. Вытяните все ветки из связки в хранилище на B.
Есть способ создать связку из всех веток репозитория. Но есть ли способ вытащить все ветви пакета в локальный репозиторий одновременно?
Двухсторонняя синхронизация кажется простой в случае репозиториев с одной ветвью.
1 ответ
Поскольку пакет похож на любой другой репозиторий - единственное отличие состоит в том, что пакет хранится как один файл - вы можете использовать git pull --all
извлечь все ветви из пакета и объединить их в соответствующие ветви отслеживания:
git pull --all /path/to/bundle
Обратите внимание, однако, что --all
опция относится только к git fetch
, Это означает, что только текущая локальная ветвь (то есть та, на которую ссылается HEAD
) будет обновляться. Если вы также хотите обновить все локальные ветки, вам придется написать скрипт для него самостоятельно или использовать что-то вроде git-up.
Добавьте следующий псевдоним pullbundlebranches git в свой ~/.gitconfig
а затем запустить git pullbundlebranches ../[filename].gitbundle
.
[alias]
pullbundlebranches = "!f() { git pull --tags $1; git fetch $1; git bundle verify $1 | grep ' refs/heads/' | (while read line; do \
commit=`echo $line | cut -d' ' -f1`; branch=`echo $line | sed 's_[^\\ ]*\\ refs/heads/__'`; \
if git show-ref -q --heads $branch; then \
old_commit=`git rev-parse $branch`; \
if [ \"$old_commit\" = \"$commit\" ]; then \
echo 'Skipping' $branch 'which is up-to-date at' $old_commit; \
elif git merge-base --is-ancestor $branch $commit; then \
current_branch=`git rev-parse --abbrev-ref HEAD`; \
if [ \"$current_branch\" = \"$branch\" ]; then \
git reset --hard $commit; \
else \
git branch -Dq $branch; git branch $branch $commit; \
fi; \
echo 'Updated' $branch 'from' $old_commit 'to' $commit; \
elif git merge-base --is-ancestor $commit $branch; then \
echo 'Skipping' $branch 'which is ahead of bundle version ('$commit')'; \
else \
echo 'Error:' $branch 'already exists and diverges from upstream found in bundle'; \
echo 'You could switch to the bundle version as follows, but you might lose work.'; \
echo 'git checkout -B' $branch $commit; \
fi; \
else \
git branch $branch $commit; \
echo 'Created' $branch 'pointing at' $commit; \
fi; done); }; f"
Он извлекается из пакета, а затем пытается обновить / создать каждую содержащуюся в нем ветвь. Если ваша собственная версия ветки впереди или равна, ничего не делается. Если эта ветка отличается от версии в пакете, выводится сообщение об ошибке с указанием, как перейти на версию пакета, и ничего не делается.
Пример запуска, затем принудительного перехода к версии в пакете, а затем повторного запуска, который ничего не делает:
$ git pullbundlebranches ../../bundles/Jabberwocky_November_snapshot.gitbundle
From ../../bundles/Jabberwocky_November_snapshot.gitbundle
* branch HEAD -> FETCH_HEAD
../../bundles/Jabberwocky_November_snapshot.gitbundle is okay
Error: develop already exists and diverges from upstream found in bundle
You could switch to the bundle version as follows, but you might lose work.
git checkout -B develop 6c5214a7bd9b10d5f9e49ab9eadaa1533867ebb7
Created feature/all_glory_to_him pointing at 645152be25e0e5d3eb80615c9173e88714b23ade
Created feature/praise_the_lord pointing at 6c5214a7bd9b10d5f9e49ab9eadaa1533867ebb7
Created feature/why_are_you_reading_the_branch_names pointing at a55f5f74d6b129d173770e91c5a0ffe8ff981e8e
$ git checkout -B develop 6c5214a7bd9b10d5f9e49ab9eadaa1533867ebb7
Reset branch 'develop'
Your branch is up to date with 'origin/develop'.
$ git pullbundlebranches ../../bundles/Jabberwocky_November_snapshot.gitbundle
From ../../bundles/Jabberwocky_November_snapshot.gitbundle
* branch HEAD -> FETCH_HEAD
../../bundles/Jabberwocky_November_snapshot.gitbundle is okay
Skipping develop which is up-to-date at 6c5214a7bd9b10d5f9e49ab9eadaa1533867ebb7
Skipping feature/all_glory_to_him which is up-to-date at 645152be25e0e5d3eb80615c9173e88714b23ade
Skipping feature/praise_the_lord which is up-to-date at 6c5214a7bd9b10d5f9e49ab9eadaa1533867ebb7
Skipping feature/why_are_you_reading_the_branch_names which is up-to-date at a55f5f74d6b129d173770e91c5a0ffe8ff981e8e