2010-07-21 3 views
39

У меня проблема, которая кажется очень простой, но ее трудно решить. Я получаю указанную ошибку после удаления каталога. Я еще не нашел решения для разрешения конфликта. Так оно и происходит:Ошибка SVN: устаревший каталог

 
svn add dir 
svn add dir/file1 
svn commit 
svn add dir/file2 
svn commit 
svn delete dir 
svn commit 
--> commit failed 
--> Directory '/dir' is out of date 

Очевидное решение svn update не работает. После обновления Svn следующий фиксации терпит неудачу с:

 
Commit failed 
Directory '/dir' remains in conflict. 

В то же время я нашел решение, но это немного громоздким:

 
svn resolve --accept working dir 
svn commit --> still fails 
svn update 
svn commit --> still fails 
svn resolve --accept working dir 
svn commit --> NO PROBLEM! 

два вопроса: - может кто-нибудь объяснить это поведение, потому что я очень любопытно об этом - эта проблема возникает в perl-скрипте в гораздо более сложной ситуации. Может ли кто-нибудь дать мне простое решение с «выполнимо» в perl-скрипте?

ответ

58

Просто сделайте svn update, а затем ваша фиксация должна работать.

+2

избил меня к нему. И чтобы добавить к этому, обновление должно быть частью вашего обычного рабочего процесса. Обычно я обновляю до фиксации. – hometoast

+0

Это было одно из очевидных решений, о которых я думал.Но после обновления svn я получаю: svn commit -> '\ dir' остается в конфликте –

+0

, но 'svn update' удаляет изменения в вашем рабочем каталоге, поэтому вся ваша работа будет удалена и ничего не будет сделано. Я прав? – VextoR

1

Вам просто нужно обновить, а затем совершить

+1

Это было одно из очевидных решений, о которых я думал. Но после обновления svn я получаю: svn commit -> '\ dir' остается в конфликте –

1

Вы пробовали svn up dir, прежде чем делать окончательный совершить?

+1

Это было одно из очевидных решений, о которых я думал. Но после обновления svn я получаю: svn commit -> '\ dir' остается в конфликте –

57

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

Subversion отслеживает текущую версию для каждого файла и каталога отдельно. Всякий раз, когда происходит изменение файла, ревизия родительского каталога изменяется в репо, но у вашей рабочей копии все еще есть каталог в его старой версии.

Итак, в вашем сценарии после добавления файла родительский каталог в репо имеет более высокую версию, чем ваша рабочая копия. При попытке удалить каталог, работающий на устаревшей версии.

Для решения:

Делают svn update после добавления файла, но перед удалением реж.

В общем случае, если вы не хотите вносить какие-либо изменения, вы можете ограничить обновление самой директорией: svn up --depth empty dir.

+0

Большое спасибо за это, @Stephen Friedrich - просто хотел заметить, что при выполнении 'svn mv' целого каталога (что и привело меня на этот пост), добавление и удаление происходит за один шаг; и, к сожалению, кажется, что «сделать обновление svn после добавления файла, но перед удалением dir» в этом случае не может быть применено. Однако для меня работало вручную, чтобы удалить старый каталог (с помощью 'rm -rf'), а затем снова зафиксировать. Ура! – sdaau

+0

Я с радостью рассмотрю этот ответ, чтобы довести его до вершины. – Brandon

+0

@ Стефен Фридрих, выкрикните, если вы окажитесь возле Бергамо, Италия, я должен вам ужин ... –

0

Чтобы обойти эту проблему, я использовал «svn revert», затем повторю фиксацию, которая должна избавиться от содержимого в then do 'svn delete' и снова зафиксировать. У меня возникла проблема с переименованием каталога, но, надеюсь, это сработает.

0

Сделайте обновление, очистку и затем зафиксируйте.

0

Аналогичная проблема, я столкнулся со свежей рабочей области:

$ svn delete dir/file 
D   dir/file 
$ svn ci -m "comment1" 
Deleting  dir/file 
$ svn delete dir/ 
D   dir 
$ svn ci -m "comment2" 
Deleting  dir 
svn: Commit failed (details follow): 
svn: Item 'dir' is out of date 

Чтобы решить эту проблему, я вновь обновляемые источники и использовать «Удалить URL» команду:

$ svn delete --force https://server/path.../dir 
$ svn update 
Смежные вопросы