git bundle: двусторонняя синхронизация всех веток между локальным и удаленным репо

Машина A имеет подключение к Интернету, а машина B - нет. Оба имеют локальный репозиторий, и машина A может взаимодействовать с Github. Разработка происходит на обеих машинах. git-bundle используется для синхронизации репозиториев.

Обычный поток синхронизации:

  1. Создайте связку всех ветвей в B и перенесите связку в A.

  2. Хранилище клонов github на A. Вытяните все ветви из связки в репозиторий, клонированный из github. Вставьте обновленный репозиторий (все ветви) в github.

  3. Создайте связку всех веток из репозитория 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
Другие вопросы по тегам