#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 в корневой папке)
- клонируйте ветку из репозитория SVN (теперь у вас есть один файл локально)
- локальная фиксация в git (включая
git add .
) - создайте старую папку с файлом в ней
- локальная фиксация в git (включая
git add .
) - dcommit для SVN
- переименовать старую папку -> Новую папку (переименовать с помощью IDE или вручную — нет
git-mv
) - локальная фиксация в git (включая
git-add .
) - 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 выше:
- переименовать старую папку -> Новую папку (переименовать с помощью IDE или вручную — не git-mv)
- git добавить новую папку
- git rm -r старая папка
- локальная фиксация
На этом этапе 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).