git поддерживает синхронизацию нескольких удаленных серверов со всеми филиалами - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть два компьютера, на которых я хранил свои репозитории. Они не подключаются через любую сеть! Давайте назовем репо на этих двух разных компьютерах repo1 и repo2.

И у меня есть местный "клон", который я могу перемещать с одного компьютера на другой. Давайте назовем этот клонированный репозиторий просто «клоном».

Если я сейчас получу свой клон из источника (который здесь repo1), все в порядке. Но если мне нужно использовать repo2, я не могу запустить его!

Просто команда

git fetch --all repo2

дает мне: fetch - все не принимает аргумент хранилища

На данный момент я не знаю, как продолжить.

Я нашел много воров, таких как: Как клонировать все удаленные ветви в Git?

Но ни один из ответов, касающихся нескольких репо!

Это просто не поддается управлению?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Ответ ErikMD на два источника - правильный путь.

Однако, если вас не волнует принудительное продвижение репо, т. Е. Вы запустили (git pull --all или git fetch -all) и уверены, что другой компьютер не будет ничего совершать в течение того времени, когда вы это делаете, то:

git push --mirror

Из документов:

- зеркало

Вместо того, чтобы называть каждый ref для push, указывает, что все refs в refs / (которые включают в себя, но не ограничиваются refs / head /, refs / remotes / и refs / tags /), будут отражаться в удаленном репозитории. Вновь созданные локальные ссылки будут отправлены на удаленный конец, локально обновленные ссылки будут принудительно обновлены на удаленном конце, а удаленные ссылки будут удалены с удаленного конца. Это значение по умолчанию, если задан параметр конфигурации remote..mirror.

Другой способ исправить ошибку all - попробовать этот ответ .

0 голосов
/ 29 апреля 2018

Во-первых, я бы посоветовал проверить URL ваших репо на карту, выполнив git remote -v. Для продолжения я предполагаю, что у вас есть два пульта с именами origin и repo2.

Относительно вопроса SO, который вы упомянули - Как клонировать все удаленные ветви в Git? - следует отметить, что не нужно извлекать все ветви для их извлечения, потому что git fetch repo2 достаточно, чтобы локально получить всю историю удаленного repo2.

Согласно документу о git fetch , вы также можете сделать git fetch --all (без дополнительных аргументов) вместо git fetch origin ; git fetch repo2.

Напомню, что для перечисления удаленных ветвей, соответствующих удаленному, называемому repo2, вы можете просто сделать git branch -r, который покажет что-то вроде:

origin/HEAD -> origin/master
origin/master
origin/name-of-an-origin-branch
...
repo2/HEAD -> repo2/master
repo2/master
repo2/name-of-a-repo2-branch
...

то есть все удаленные ветви имеют префикс идентификатора удаленного.

Чтобы просмотреть содержимое этих удаленных веток (без необходимости подключения к Интернету), вы можете либо сделать gitk --all, чтобы отобразить сводную информацию только для чтения истории всех ветвей, либо git checkout name-of-a-repo2-branch, чтобы создать локальную ветвь, связанная с веткой отслеживания name-of-a-repo2-branch (см. документ git checkout ).

Или вы можете выполнять обычные манипуляции с git, такие как merge (например, git merge origin/master), rebase (например, git rebase repo2/master), включая отслеживание веток из ваших удаленных репозиториев.

Предложение рабочего процесса для синхронизации двух репозиториев

Что касается вашего основного варианта использования (синхронизировать два репозитория, которые не связаны напрямую с сетью, используя «локальный перемещаемый клон»), я думаю, что самая простая конфигурация будет иметь «голый» перемещаемый промежуточное репо (т. е. репо без рабочего каталога, см. соответствующий документ ) по указанному локальному URL, скажем «file: ///path/to/bare-repo.git».

Чтобы настроить одно из таких репо, вы можете просто сделать:

git init --bare /path/to/bare-repo.git

Тогда в repo1 вы можете выполнить следующую настройку:

git remote add sync file:///path/to/bare-repo.git
git config alias.pull-ff-sync '!f(){ git fetch sync && git for-each-ref --format "%(refname:strip=3)" refs/remotes/sync/ | grep -v -e '\''^HEAD$'\'' | xargs -n1 bash -c '\''git checkout -q "$1" && git pull --ff-only -v sync "$1"'\'' bash; }; f'
git config alias.pull-ff-sync  # to check the alias has been properly setup
# and in particular that the «'\''» have been replaced with single «'»

git config push.default matching

for b in master develop ... ; do git push sync ${b}; done
# push all the branches you want to sync

И, конечно, аналогичная настройка в repo2:

git remote add sync file:///path/that/can/be/different/to/bare-repo.git
git config alias.pull-ff-sync '!f(){ git fetch sync && git for-each-ref --format "%(refname:strip=3)" refs/remotes/sync/ | grep -v -e '\''^HEAD$'\'' | xargs -n1 bash -c '\''git checkout -q "$1" && git pull --ff-only -v sync "$1"'\'' bash; }; f'
git config push.default matching

Теперь в repo1 (соответственно в repo2) вы можете выполнить синхронизацию следующим образом:

  • , чтобы извлечь все выбранные вами ветви и объединить их, если операция fast-forward (поэтому эта команда более мощная, чем просто git fetch sync, потому что все локальные ветви будут обновлены, если фиксация слияния вручную не требуется):

    git pull-ff-sync
    
  • , чтобы нажать все выбранные вами ветви (что зависит от настройки matching конфигурации push.default ):

    git push -v sync
    

Замечание, чтобы избежать одного шага настройки

Обратите внимание, что если вы не хотите изменять конфигурацию push.default ваших двух репозиториев (например, если вы также хотите использовать git push, чтобы перенести только одну ветку из репо1 на другой пульт ...), вы можно вместо:

  • заменить

    git config push.default matching
    

    с

    git config push.default upstream
    

    или просто с

    git config push.default simple  # the default config in Git >= 2.0
    
  • выполните чуть более длинную команду ниже, чтобы отправить все соответствующие ветви из repo1 (соответственно repo2) на удаленный синхронизатор за один раз:

    git push -v sync :
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...