Во-первых, я бы посоветовал проверить 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 :