GIT SVN dcommit после переименования папки

#git #repository #directory #git-svn #dcommit

#git #репозиторий #каталог #git-svn #dcommit

Вопрос:

Я не смог найти аналогичный ответ на свой вопрос.

Ситуация:

Локально с использованием GIT (версия GIT 1.7.3.1.msysgit.0)
Удаленный репозиторий — SVN (не уверен в версии)


Проблема:

Клонируйте репозиторий SVN, добавьте папку, зафиксируйте ее в git и SVN, переименуйте папку (не сообщая git), зафиксируйте в git, больше не может фиксироваться в SVN.


Шаги проблемы (в репозитории SVN есть один файл main.as в корневой папке)

  1. клонируйте ветку из репозитория SVN (теперь у вас есть один файл локально)
  2. локальная фиксация в git (включая git add . )
  3. создайте старую папку с файлом в ней
  4. локальная фиксация в git (включая git add . )
  5. dcommit для SVN
  6. переименовать старую папку -> Новую папку (переименовать с помощью IDE или вручную — нет git-mv )
  7. локальная фиксация в git (включая git-add . )
  8. dcommit для SVN (не нужно перебазировать SVN, так как я единственный, кто вносит изменения в SVN)

ПРОБЛЕМА: отвечает git-svn dcommit:

 oldFolder/file.txt: needs update

update-index --refresh: command returned error: 1
  

Что я пробовал:

  • stash, commit, dcommit, stash применяются (то же самое: требуется обновление)
  • тайник, перебазирование, применение тайника, фиксация, dcommit (то же самое: требуется обновление)
  • stash, перебазирование, применение stash, фиксация, stash, dcommit (то же самое: требуется обновление)

Тот, который наполовину работал, состоял в том, чтобы вызвать:

 svn rm -r oldFolder
  

но это закончилось oldFolder и newFolder в SVN… в то время как я хочу oldFolder быть либо переименованным, либо удаленным (в этом случае я не против потерять историю).

Мне нужно, чтобы репозиторий SVN отражал мой локальный git master / branch…


Почему я переименовываю файлы без команды git?
Я работаю с большими файловыми структурами, и IDE, которые я использую для рефакторинга старого кода, переименовывает несколько папок и файлов, вызывая описанный выше сценарий. Я не могу отслеживать и вызывать git rm для каждой удаленной папки.

Комментарии:

1. Вы уверены, что вам не нужно делать git svn rebase сначала? Похоже, есть изменения svn, которых у вас еще нет.

2. спасибо за предложение. перебазирование git svn приведет к той же проблеме. Кроме того, я единственный человек, который в настоящее время подключается к svn прямо сейчас.

Ответ №1:

На шаге 7 вы организовали добавление нового файла (newFolder/file.txt ), но не удаление старого файла. Вам нужно будет выполнить следующее вместо шагов 6 и 7 выше:

  1. переименовать старую папку -> Новую папку (переименовать с помощью IDE или вручную — не git-mv)
  2. git добавить новую папку
  3. git rm -r старая папка
  4. локальная фиксация

На этом этапе git будет отслеживать переименования (если таковые имеются) и создавать правильную фиксацию для SVN.

Если ваше дерево все еще находится на шаге 7, вы можете сделать

 git reset --soft HEAD~
  

чтобы вернуться к предыдущей фиксации и выполнить удаление.

Комментарии:

1. @Devin … спасибо за ответ, и да, это сработало бы, но, к сожалению, не для моей ситуации. Я работаю с большим количеством файлов, и в случае, когда я рефакторирую большое количество папок (иногда с помощью одной команды), вызов add/rm для всех новых и старых папок будет головной болью. Я надеялся, что у git есть способ узнать, какие файлы были добавлены (git add -A), а какие были удалены, без необходимости явно называть каждый из них.

2. @mihai Git знает, какие из них были удалены, но вы должны подготовить их для фиксации удаления. В противном случае это просто изменения в вашем рабочем дереве. Кажется, вам может понадобиться опция «git add -u», которая будет вносить все изменения в отслеживаемые файлы, включая удаления, но игнорировать неотслеживаемые файлы.

3. Спасибо. объяснение очень четкое, и я попробую.

Ответ №2:

(Добавляю еще один ответ просто для полноты картины)

A git add --all добавляет все изменения, включая удаления и переименования.

Таким образом, следующая последовательность команд обычно «просто работает», даже в случае переименования папок:

 git add --all
git commit -m "some msg"
git svn dcommit
  

На самом деле нам это не нужно git rm -r OLD_FOLDER (если, конечно, мы не хотим точно настроить определение индекса Git).