Предполагая, что вы можете уронить «зеркальное» требование, и есть «местные (голые) Сделки рЕПО $ X также копирует вверх по течению репо $ UX с помощью ссылки/головы/вверх/$ ветви назвать вверх по течению ветви, известные там как ссылки/глав/$ X», использовать второй подход, но сделать это вместо того, чтобы:
$ cd /tmp; mkdir tt; cd tt; git clone --bare ssh://$upstream_host/tmp/t
$ cd t.git
$ git config remote.origin.fetch '+refs/heads/*:refs/heads/upstream/*'
$ git fetch -p # accidentally omitted this step from cut/paste earlier
Предполагается, что вы не будете использовать имена ветвей, например upstream/master
.(Вы можете также/вместо сделать что-то вроде:
git config remote.origin.fetch '+refs/*:refs/upstream/*'
refs/upstream/*
но ссылки не копируются обычным git clone
, git fetch
и т.д., так что это больше боли для «нормальных» пользователей GIT.)
Давайте сделаем клон из --bare
репо, чтобы посмотреть, что будет, когда мы продолжим. (Для справки, на $upstream_host
, у меня есть /tmp/t
, регулярное git repo. На $local_host
, машина не совсем зеркального, у меня есть , a --bare
repo, который делает это отслеживание вверх. Я фактически использую тот же хост для обоих но принцип применит ...)
$ cd /tmp; mkdir xt; cd xt; git clone ssh://$local_host/tmp/tt/t.git
Cloning into 't'...
remote: Counting objects: 96, done.
remote: Compressing objects: 100% (54/54), done.
remote: Total 96 (delta 33), reused 96 (delta 33)
Receiving objects: 100% (96/96), 17.11 KiB | 0 bytes/s, done.
Resolving deltas: 100% (33/33), done.
Checking connectivity... done
Теперь я сделал изменения на $upstream_host
в /tmp/t
, и совершил его. Назад на $local_host
:
$ cd /tmp/tt/t.git; git fetch -p origin # -p will prune deleted upstream/foo's
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
From ssh://$host/tmp/t
+ c10e54c...5e01371 master -> upstream/master (forced update)
Таким образом, изменения, сделанные выше будет отображаться в «своего рода зеркало, но не совсем» голый мерзавец репо как изменение upstream/master
, а не master
, или в более общем плане, upstream/$branch
для любого $branch
. Если вы хотите объединить их, вам придется сделать это вручную. Мой пример ниже немного грязный, потому что изменение, которое я сделал на $upstream_host
, было переписано в истории (отсюда все forced update
), который заканчивается тем, что открывается через клоны. Если вы не хотите, чтобы это было разоблачено, вам нужно будет заметить, какие обновления переписывали историю и (по сути) вручную копировали их в свое собственное не совсем зеркало, а затем на любые клоны этого. Я просто пойду и сделаю реальное слияние.
Итак, теперь мы идем к не-голым репо $local_host
, в /tmp/xt/t
:
$ cd /tmp/xt/t
$ git fetch
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 1), reused 1 (delta 0)
Unpacking objects: 100% (4/4), done.
From ssh://$local_host/tmp/tt/t
+ c10e54c...5e01371 upstream/master -> origin/upstream/master (forced update)
$ git status
# On branch master
nothing to commit, working directory clean
$ git log --oneline --decorate --graph
* 5e01371 (origin/upstream/master) add ast example
| * c10e54c (HEAD, origin/master, origin/HEAD, master) add ast example
|/
* 309b36c add like_min.py
... [snipped]
$ git merge origin/upstream/master
Merge remote-tracking branch 'origin/upstream/master'
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
...
$ git push
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
...
Counting objects: 1, done.
Writing objects: 100% (1/1), 244 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To ssh://$local_host/tmp/tt/t.git
c10e54c..e571182 master -> master
Я теперь обновил --bare
клон ($local_host
, /tmp/tt/t.git
) через без голого клона слить вверх по течению в мое местное не-точно-зеркало. Пересмотр HEAD
мое слияние, HEAD^1
оригинальное (прерывистый) обновление, которое раньше origin/upstream/master
(перед всем «принудительным обновлением» ING), и HEAD^2
исправленного обновление, которое теперь origin/upstream/master
(позже):
$ git rev-parse HEAD^2 origin/upstream/master
5e013711f5d6eb3f643ef562d49a131852aa4aa1
5e013711f5d6eb3f643ef562d49a131852aa4aa1
(название просто upstream/master
в --bare
клоне, так что выше git rev-parse
от /tmp/xt/t
не /tmp/tt/t.git
.)
Там фундаментальный конфликт между «имеющим зеркалом» (репо Х всегда идентичен, по модулю задержки зеркального отображения, как и выше по потоку версия UX) и "сохранение локального c hanges "(repo X определенно не идентичен восходящему UX). Выберите не более одного, а затем выберите решение. – torek