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-ids:

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" --- и удаленный с подписью.

Чтобы восстановить:

  1. Создайте временную ветку, чтобы сохранить ваше текущее состояние (какая-то резервная копия): git co -b backup
  2. Убедитесь, что 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).

Другие вопросы по тегам