GIT Clones на нескольких машинах - PullRequest
2 голосов
/ 04 мая 2010

Вот мои настройки ...

Ноутбук (Mac) - git clone из репозитория SVN

Дисковод для большого пальца - git clone хранилища git для ноутбука

Сервер (Win Server 08) - git clone хранилища флеш-накопителей

У меня проблемы с синхронизацией по какой-то причине ...

Если я внесу изменения на сервере, я сделаю «git pull» на флэш-диске, чтобы получить изменения. Отнесите флеш-накопитель к ноутбуку и выполните «git pull» на ноутбуке. Оттуда я могу сделать «git svn dcommit», и все без проблем переходит в репозиторий SVN.

Если я извлекаю изменения из SVN с помощью «git svn rebase», а затем вытягиваю на флеш-накопитель и делаю «git status», это говорит о том, что я ## ревизий впереди master / origin и могу не понимаю, почему.

Сервер

>git remote show
origin 

>git remote show origin
* remote origin
  Fetch URL: E:/proj
  Push  URL: E:/proj
  HEAD branch: master
  Remote branch:
   master tracked
  Local ref configured for 'git push':
   master pushes to master (local out of date)

ноутбук

>git remote show
(nothing)

>git remote show origin
fatal: 'origin' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

Thumb-диск

>git remote show
origin

>git remote show origin
* remote origin
  Fetch URL: /Users/me/ui/proj
  Push  URL: /Users/me/ui/proj
  HEAD branch: (unknown)
  Remote branch:
   master tracked
  Local branch configured for 'git pull':
   master merges with remote master
  Local ref configured for 'git push':
   master pushes to master (up to date)

Ответы [ 2 ]

5 голосов
/ 04 мая 2010

Команды Git, такие как pull, на самом деле не работают с rebases.

Допустим, на вашем ноутбуке есть некоторые коммиты, которых еще нет в svn, а флеш-накопитель синхронизирован. Примерно так:

laptop:
svn1 -- svn2 -- A -- B -- C -- D

thumb drive:
svn1 -- svn2 -- A -- B -- C -- D

Затем вы делаете git svn rebase, чтобы получить новый материал от svn. Это работает в два этапа:

laptop (after fetching from svn)
svn1 -- svn2 -- svn3 -- svn4
          \
           + A -- B -- C -- D

Теперь мы должны поместить вашу работу с git поверх новых коммитов svn, поэтому у нас все еще есть неразветвленная история. Это часть перебазировки:

laptop (after git svn rebase)
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D'

Теперь, если нет конфликтов, коммит А 'содержит те же изменения, что и старый коммит А, единственное, что отличается от его предка: svn4 вместо svn2. Поскольку история является частью каждого коммита в git, для git A и A 'это разные коммиты.

Итак, после того, как вы выполните git pull от репозитория ноутбука до репозитория с большим диском, git делает то, что естественно для него, то есть объединяет новые изменения:

thumb drive (after git pull)
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D'
          \                                         \
           + A -- B -- C -- D -------------------- merged result

Это имеет полный смысл в git, поскольку позволяет отслеживать все изменения в нелинейной среде и отмечать, кто и как выполнял слияния. Тем не менее, вы не сможете передать эту историю svn.

Если вы принудительно внесете изменения в репо с большим пальцем, вы получите что-то вроде этого:

thumb drive (after forced push)
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D'

, что вполне нормально, если вы не сделали никаких изменений в репозитории с большим диском. Если бы вы сделали, это перезаписало бы их. Чтобы сохранить изменения с флеш-накопителя, вам нужно сделать еще один git rebase.

Я бы сказал, что для того, чтобы использовать полный комфорт git, вам придется отказаться от возможности передавать свою работу svn. Нет простого способа одновременно распределенного контроля версий и линейных историй.

0 голосов
/ 04 мая 2010

Это потому, что код git svn rebase отменяет любые коммиты в хранилище. Если какие-либо сделанные вами git-коммиты не были переданы в репозиторий верхнего уровня, идентификатор коммитов изменится, и ваши другие репозитории еще не увидят этого изменения. Это мое лучшее предположение прямо сейчас. Ваш рабочий процесс немного смущает меня. Диаграмма ascii может немного помочь, но это будет немного работы;)

На мой взгляд, лучший способ сделать это может быть git push -f ... к вашему флэш-накопителю после каждого git svn rebase. В основном, принудительно обновить флэш-накопитель. Но, честно говоря, я не такой уж и гитарный гуру.

...