Могу ли я восстановить потерянные коммиты в репозитории SVN, используя локальную ветку git-svn для отслеживания? - PullRequest
4 голосов
/ 26 апреля 2010

Репозиторий SVN, который я использую для отслеживания с помощью git-svn, недавно был поврежден и была восстановлена ​​резервная копия. Тем не менее, за неделю восстановления были потеряны. Можно ли восстановить эти потерянные коммиты, используя git-svn dcommit в моем локальном репозитории git? Достаточно ли выполнить git-svn dcommit с SHA1 последнего восстановленного коммита в SVN? например.

> svn info http://tracked-svn/trunk | sed -n "s/Revision: //p"
252
> git log --grep="git-svn-id:.*@252" --format=oneline | cut -f1 -d" "
55bb5c9cbb5fe11a90ec2e9e1e0c7c502908cf9a
> git svn dcommit 55bb5c9cbb5fe11a90ec2e9e1e0c7c502908cf9a

Или git-svn-id нужно будет удалить из предполагаемых коммитов?

Я попытался сделать это, используя --dry-run, но не смог определить, будет ли он пытаться отправить все коммиты:

> git svn dcommit --verbose --dry-run 55bb5c9cbb5fe11a90ec2e9e1e0c7c502908cf9a
Committing to http://tracked-svn/trunk ...
dcommitted on a detached HEAD because you gave a revision argument.
The rewritten commit is: 55bb5c9cbb5fe11a90ec2e9e1e0c7c502908cf9a

Спасибо за вашу помощь.

Ответы [ 3 ]

3 голосов
/ 26 апреля 2010

Вот как я добился того, чего хотел:

  1. Повторно клонирован http://tracked-svn/trunk в новом репозитории git-svn.
  2. Добавлен мой старый репозиторий git-svn в качестве пульта для свежего репо. (напр. git remote add -f up-to-date /path/to/repo)
  3. git merge remotes/up-to-date/master
  4. git svn dcommit

Перебазирование на моем старом репо не дает ошибок, и dcommit работает как положено.

Возможно, это не лучший способ восстановить коммиты, но он дал мне то, что я хотел.

1 голос
/ 26 апреля 2010

Не полный ответ, но этот поток может немного объяснить сообщение об ошибке:

'git svn dcommit' принимает необязательный аргумент ревизии, но его значение было довольно страшным.
Он полностью игнорировал текущее состояние HEAD, глядя только на изменения между SVN и $rev.
Если HEAD был присоединен к $ branch, ветвь потеряла все коммиты $ rev .. $ branch в процессе.

Учитывая, что 'git svn dcommit HEAD^' имеет интуитивное значение "dcommit все изменения в моей ветви, кроме последней", мы меняем значение аргумента ревизии.
git-svn временно проверяет $rev на свою работу, что означает:

  • если указана ветвь, эта ветвь ( не HEAD) перебазируется как часть dcommit,
  • если указана какая-либо другая ревизия, как в примере, вся работа выполняется на отдельном HEAD, и ветвь не затрагивается.

Я не уверен, был ли этот патч интегрирован в версию Git, но если вы тестируете свой dcommit, обязательно наберите git branch -b после dcommit, чтобы ссылаться на текущий HEAD с веткой. Будет ли это работать на стороне SVN? Я не знаю.

0 голосов
/ 12 января 2011

Я нашел эту статью, которая пролила некоторый свет на ситуацию detached_head .

Я имел дело с более или менее такой же проблемой здесь, и вот что я закончил:

  • Во-первых, всегда убедитесь, что вы находитесь в действительной ветке git branch
  • Если вы видите (no branch) (со звездочкой, обозначающей «текущую ветвь»), это означает, что у вас отсоединенная головка
  • Оформить отсоединенную головку git co -b [BRANCH NAME] --track. Используя опцию --track, I THINK позволяет отслеживать git-svn HEAD и, следовательно, присоединять эту новую ветвь к HEAD.
  • Продолжить с git svn rebase/dcommit командами в обычном режиме.

Это, вероятно, плохо, но это также, похоже, помогло - я удалил ветку master, а затем после выполнения git svn rebase, кажется, снова автоматически добавляется в ветку master.

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

Я не уверен на 100%, что это совершенно правильно, но мне показалось, что это работает для меня.

...