2014-11-29 4 views
1

Несколько лет назад я создал публичный репозиторий проекта SourceForge на Github. Тогда проект поддерживал только CVS, поэтому я использовал git cvs для периодической синхронизации моего репозитория с оригиналом.Как слить репозиторий git с изменениями из разных upstream

В течение долгого времени не было каких-либо обязательств в репозитории CVS, и теперь я узнал, что они также перешли на git (хотя и на Sourceforge, а не на Github).

Мой вопрос сейчас: Как объединить изменения в репозитории SF git в моем репозитории?

То, что я пытался до сих пор:

  1. Добавить новый удаленный репозиторий 'вверх', указывающий на SF мерзавца репо
  2. git fetch upstream
  3. git checkout master
  4. git merge upstream/master

Последний шаг работает без ошибок, но git status говорит мне, что мастер & изначальный/тормозные колодки отклонения. Выполнение git pull теперь приводит к множеству конфликтов («CONFLICT (add/add)»).

ответ

2

Если вы просто обновляете свои модификации на ветвях, импортированных из cvs, это может быть очень просто.Моя первая попытка будет соответствовать фиксациям выявляемого текста в их совершивших сообщениях, а затем попытаться соответствовать патчу-идентификаторы

установка: найти ток базы фиксации для работы:

currentbase=$(git merge-base master [email protected]{u}) 
git show -s $currentbase 

Теперь, чтобы найти соответствующий совершить в upstream/master:

git checkout upstream/master 
git show -s :/"some regex for unique-looking text in the $currentbase message" 
# and if that's right 
newbase=`git rev-parse !git:$` # !git:$ is last arg to previous git command 

и если это не сработает, попробуйте найти коммит, который применяет один и тот же патч:

patchids=`mktemp` 
git rev-list upstream/master \ 
| while read; do 
     git diff-tree -p $REPLY | git patch-id 
    done >> $patchids 

# hunt up a commit that makes the same changes as $currentbase 
set -- `git diff-tree -p $currentbase | git patch-id` 
grep $2 $patchids 
# and if it finds one 
set -- $(!grep) # !grep is whole of last grep command 
newbase=$2 

Однако вы нашли его, когда вы получаете право на один

git rebase --onto $newbase [email protected]{u} master 
git branch -u upstream/master 

От там, вы можете сделать, как обычные, простые git rebase по умолчанию для текущей вверх по течению.

+0

Мне нравится этот подход, чтобы найти общую историю (вместо ручного осмотра, о котором я упоминал в своем ответе). +1 – VonC

+0

Я следовал вашим указаниям, но, к сожалению, он не работал должным образом. Первая проблема заключается в том, что HEAD-фиксация моей ведущей ветки была сделана сама («обновленный gitignore»), поэтому я не могу найти ссылку на upstream/master. Однако HEAD-1 будет работать. Вторая проблема заключается в том, что 'git show -s ...' на ветке upstream/master обнаруживает хеш фиксации из неправильной ветви (это хеш от master вместо upstream/master). В-третьих, даже при установке текущей базы и новой базы вручную команда rebase не работает: «Ошибка: нет восходящего потока, настроенного для ветви« master ». Fatal: нужна одна ревизия« – 1100101

+0

Nevermind. Это сработало! Я случайно удалил информацию о восходящем потоке на главном компьютере, что и послужило причиной сообщения об ошибке. – 1100101

0

Вопрос заключается в том, что истории о входе/мастера и мастера совершенно разные (каждый коммит другой SHA1)

Вы должны смотреть на историю восходящего/мастера, и определить, какие коммиты из Sourceforge Git repo, которые являются новыми по сравнению с вашей собственной историей master.

Затем, вы можете:

  • создать ветвь от последнего общей фиксации на свой master ветви
  • git cherry-pick всех тех коммитов upstream/master к этой новой отрасли (которая начинается от master)
    (примечание : вы можете cherry-pick a range of commits)
  • затем слить эту новую ветку на master.
Смежные вопросы