git-svn-id отсутствует в некоторых коммитах
У меня есть старый репозиторий SVN, который я извлек с помощью git-svn
чтобы поработать над этим и подтолкнуть к Героку. Я делал довольно стандартный git push heroku master
, git svn rebase
, git svn dcommit
танцы и все было хорошо.
Тем не менее, в последнее время я делал немало мерзавца и не делал git svn rebase
через некоторое время Теперь, когда я пытаюсь выполнить ребазинг, он терпит неудачу из-за конфликтов слияния, несмотря на то, что я единственный человек, выполняющий репо и работающий только с мастером.
Поняв, что это может быть рабочая копия, это проблема, которую я сделал новый git svn clone
а затем git remote add heroku
а также git pull heroku master
, Тяга делает слияние вперед без проблем, но git svn rebase
по-прежнему не удается.
Я сделал простой git log
и я вижу, что у меня отсутствуют некоторые старые коммиты git-svn-id
s:
commit def8bab861314c67d4e8227e03775d19045d21d1
Author: peterr
Date: Fri Sep 21 16:17:33 2012 +0000
PHP Cedar support.
git-svn-id: http://vcp.unfuddle.com/svn/vcp_bbsit@24 b6b24ac3-8b7a-4c11-a811-49c5d0334e85
commit f51bd78fb07dde6ec1dc4e0ba51a48f2b6bd1bd6
Author: pr1001
Date: Mon Aug 20 19:39:42 2012 +0200
Specify port correctly
commit 153bb2929080898dcab46142120def0f4964dfab
...
commit 5a416fa3af9f64aa353d5171bedfaa563115ff62
Author: pr1001
Date: Mon Aug 20 17:22:58 2012 +0200
PHP Cedar support.
commit e0b35588d03082a3a4ab49a7b590f206346046c0
Author: j
Date: Fri Aug 3 08:13:33 2012 +0000
change email
git-svn-id: http://vcp.unfuddle.com/svn/vcp_bbsit@23 b6b24ac3-8b7a-4c11-a811-49c5d0334e85
Из SO-ответа я понял, что мог бы переписать сообщения коммита, чтобы добавить недостающую информацию, но мне интересно, не будет ли это еще хуже.
Глядя на сообщения, я вижу, что у меня есть несколько дублирующих коммитов, таких как "поддержка PHP Cedar". Я действительно озадачен, почему у меня есть эти дубликаты, хотя я подозреваю, что они могут быть переданы в сбой git push heroku master
У меня был другой день, когда мне сказали, что хранилища не синхронизированы. git pull heroku master
казалось, не внесло абсолютно никаких изменений и исправило проблему, но, возможно, это привело к дублированию коммитов.
Итак, учитывая все это, мой вопрос прост: как мне поступить? У меня есть рабочее приложение на Heroku и более старая рабочая база кода в репозитории SVN, но я не вижу простого способа как получить новые коммиты в SVN. Должен ли я их выбрать? Нужно ли мне тогда обстреливать приложение Heroku, чтобы дубликаты не возвращались?
1 ответ
Не легко догадаться, как вы попали в эту ситуацию, но я думаю, что это потому, что при нажатии на SVN git-svn заменяет (используя rebase или reset) коммиты с подписью git-svn-id, так что есть 2 примера каждого коммита: "local" - без подписи "git-svn-id" --- и удаленный с подписью.
Чтобы восстановить:
- Создайте временную ветку, чтобы сохранить ваше текущее состояние (какая-то резервная копия):
git co -b backup
- Убедитесь, что refs / remotes / git-svn указывает на последний коммит с git-svn-id, соответствующий вашему хранилищу Subversion, и что коммиты без git-svn-id не отображаются
git log refs/remotes/git-svn
Если это не так, вы можете использовать следующую уловку для восстановления refs/remotes/git-svn: обновите refs / remotes / git-svn, чтобы указать на последний коммит, где все было в порядке (в вашей ситуации это соответствует r23):
$ git update-ref refs/remotes/git-svn e0b35588d03082a3a4ab49a7b590f206346046c0
Задайте редакции.git / svn / metadata, чтобы они указывали на эту редакцию:
[svn-remote "svn"]
reposRoot = ...
uuid = <UUID>
branches-maxRev = 23
tags-maxRev = 23
Удалите (или лучше удалите) файл.git/svn/refs/remotes/git-svn/.rev_map.UUID Теперь запустите
$ git svn fetch
Ваша ссылка refs / remotes / git-svn теперь восстановлена до последней действующей версии SVN.
3 Получить все изменения из репозитория Git без слияния
$ git fetch heroku master
Теперь все ваши изменения находятся в refs/remotes/heroku/master.
4 Убедитесь, что у вас нет локальных изменений (я рекомендую, чтобы вы были на мастере сейчас). Сброс refs / heads / master на refs / remotes / git-svn. Один из способов сделать это:
$ git update-ref refs/heads/master refs/remotes/git-svn
$ git reset --hard HEAD
5 Посмотрите на refs/remotes/heroku/master и на refs / remotes / git-svn. Есть ли изменения в репозитории Git, которых нет в refs / remotes / git-svn? Если да, выбирайте их по очереди. Также взгляните на вашу резервную ветку (только на коммиты без git-svn-id), если они еще не в SVN, выберите их тоже.
6 Теперь у вас есть некоторые изменения в мастере, которых пока нет в SVN. Бежать
$ git svn dcommit
подтолкнуть их к SVN.
7 Теперь ваша ветка, связанная с SVN, полностью восстановлена и содержит все изменения. Если я правильно понимаю, вы хотите такой же контент в репозитории Git. Лучше заменить refs/remotes/heroku/master на текущее содержание мастера:
$ git push heroku master --force
Теперь ваш Git-репозиторий имеет то же содержимое, что и SVN-репозиторий.
Чтобы избежать этих проблем в будущем, убедитесь, что вы никогда не отправляете коммиты без git-svn-id в Git (т.е. когда вы запускаете "git push", ваш мастер состоит только из коммитов с сигнатурами git-svn-id - если нет - запустите "git svn dcommit", чтобы сначала отправить их в SVN).