Вот кое-что, что я недавно узнал:
git svn rebase
, прежде чем делать git svn dcommit
dcommit
, делайте это из временной промежуточной ветки - если вы (или git) испортите, гораздо проще восстановить, просто удалив ветку и начав зановоКогда svn dcommit
умирает на полпути через большой коммит и кажется, что вы потеряли всю свою историю, сделай это:
How To Recover:
First, open .git/logs/HEAD
Find the hash of the commit that's the head of your git repo. Hopefully you remember the commit message and can figure it out, but it should be pretty obvious
Back in your now f-ed up working-dir:
git reset --hard <hash from log>
This gets your working dir back to where it was before you did a git- svn dcommit. Then:
git-svn rebase git-svn dcommit
сегодня он решил, что Perl сбросит ядро на полпути - это оставило меня с моей рабочей копией, в которой отсутствовало множество изменений
При создании клона используйте --prefix=svn/
. Это создает более приятные названия веток.
Кроме того, не пренебрегайте аргументами --trunk
, --tags
и --branches
при выполнении clone
или init
.
Получение данных - один из наиболее трудоемких шагов, поэтому настройте задание cron для выполнения git svn fetch
в фоновом режиме. Это безопасно, потому что выборка не влияет ни на одну из ваших рабочих веток.
(Справочная информация о git svn fetch
: эта команда выполняется первой всякий раз, когда вы выполняете git svn rebase
, поэтому, выполняя этот шаг заранее, ваш вызов git svn rebase
обычно будет быстрее. Команда fetch
загружает коммиты SVN и вставляет их в специальные ветки, управляемые git-svn Эти ветки можно просмотреть, выполнив git branch -r
, и если вы выполнили вышеуказанный шаг, они начинаются с "svn /".)
Убедитесь, что вы знаете, как использовать git reflog
. У меня было несколько случаев, когда git svn dcommit
умирал (обычно из-за того, что я пытался проверить что-то огромное), и моя фиксация, казалось, была потеряна. В любом случае фиксацию легко найти в журнале ссылок.
Не могли бы вы подробнее рассказать о трюке с извлечением? Что это значит? Вы просто запускаете это снова и снова в фоновом режиме? После этого как внести изменения в свою ветку?
Хорошо, добавлена дополнительная информация о выборке
Если в вашем репозитории SVN есть ловушка после фиксации, которая может отклонять фиксации, git svn dcommit
прекратит обработку фиксации при первом отклонении фиксации, и вам придется восстановить оставшиеся фиксации из git reflog.
На самом деле, я думаю, что вышеупомянутая проблема была вызвана тем, что моя корова-оркер неправильно запустила git rebase -i
при попытке исправить отклоненные коммиты. Но, благодаря рефлогу, мы смогли восстановить все!
Я немного вел блог о том, как работать с Subversion и Git параллельно, а также опубликовал пару элементарных скринкастов. Собрал все тут: http://www.tfnico.com/presentations/git-and-subversion
Попробую резюме:
Согласитесь с №1, но я никогда не обнаруживал, что мне нужно было сделать №2.
dcommit
не так часто ломается, и когда это произойдет, восстановить его несложно.