2013-07-31 3 views
2

Вот что я хотел бы сделать:Git локальное зеркало и хранилище

  • локальный репозиторий Git, который отражает вверх по течению один
  • Уметь нажать «местные» ветви/изменения в этом хранилище и держать эти локально
  • держите этот репозиторий в синхронизации с восходящими один, в том числе:
    • Fetch любого новый филиал
    • Удалить все ссылки отрубей чес, которые будут удалены перед

настроить мои хроны работы, чтобы извлечь все изменения из верхних и подрезать любую ветвь, которые были удалены, как это:

*/5 * * * * cd /home/git/myrepo.git && git fetch origin && git remote prune origin > /dev/null 

До сих пор, что я пытался (и почему это не удалось):

1- НАСТРОЙКА репозиторий в качестве зеркала (как описано here)

git clone --bare --mirror URL 

Проблема с этим, когда он делает git remote prune, также удаляет ссылки на локальные изменения, которые были там нажаты (а не на восходящий сервер).

Я также попытался использовать это локальное хранилище как зеркало для двух отдельных репозиториев (с одним и тем же мастером, но с некоторыми разными ветвями), и я ударил аналогичную проблему при выполнении git remote prune, он удалит ветки, идущие из другого репозитория.

2- Установка мерзавец только как голый репозиторий:

git clone --bare URL 

Но git fetch origin не обновляется должным образом, это, кажется, загрузив объекты, но не создает реф, а затем печатает только

* branch   HEAD  -> FETCH_HEAD 

и «местоположение» текущих ветвей не обновляется с помощью того, что находится на восходящем сервере.

Я также пробовал git remote update, как описано here, с тем же результатом.

я могу convert that repository as a mirror с:

git config remote.origin.fetch 'refs/heads/*:refs/heads/*' 

Но это только возвращает меня к проблеме в (1)

+0

Там фундаментальный конфликт между «имеющим зеркалом» (репо Х всегда идентичен, по модулю задержки зеркального отображения, как и выше по потоку версия UX) и "сохранение локального c hanges "(repo X определенно не идентичен восходящему UX). Выберите не более одного, а затем выберите решение. – torek

ответ

2

Предполагая, что вы можете уронить «зеркальное» требование, и есть «местные (голые) Сделки рЕПО $ 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.)

+0

Спасибо за обширное тестирование ... – Matthieu

Смежные вопросы