Ответ 1
Я понял с помощью
svn resolve --accept working PATH_TO_FILE
который должен заканчиваться:
Разрешено конфликтное состояние 'PATH_TO_FILE'
Вот мой сценарий:
Предположим, что у нас есть SVN-репо со следующим содержанием: моя папка моя_папка\file.txt
Теперь я создаю две проверки этого репо, co1 и co2.
В co1 мы модифицируем file.txt. В co2 имеем:
Теперь, если я попытаюсь выполнить обновление в co1, я получаю конфликт дерева:
A + C myfolder > local edit, incoming delete upon update
M + myfolder\file.txt
Я хочу сохранить мою папку и измененный файл, поэтому я разрешаю конфликт дерева:
svn resolve --accept working folder
Теперь, если я попытаюсь зафиксировать, я получаю "svn: Directory" /myfolder "устаревший". Если я попытаюсь разрешить это, используя svn up myfolder, я снова получу конфликт дерева:
A + C folder > local add, incoming add upon update
M + myfolder\file.txt
Хорошо, поэтому мы снова попробуем svn resolve --access рабочую папку. Но мы все еще не можем зафиксировать, мы получаем то же сообщение, что "svn: Directory" /myfolder "устарели", если мы делаем svn вверх по моей папке, мы возвращаемся к последнему конфликту с деревом.
Какова правильная процедура для разрешения конфликта такого типа (когда мы хотим сохранить мою папку и ее изменения)?
EDIT: Windows cmd line script, чтобы проиллюстрировать:
rmdir /S /Q C:\svntest
mkdir C:\svntest
cd C:\svntest
svnadmin create repo
svn co file:///c:/svntest/repo co1
svn co file:///c:/svntest/repo co2
cd co1
mkdir folder
echo content > folder\file.txt
svn add folder
svn commit folder -m ""
cd C:\svntest\co2
svn up
cd C:\svntest\co1
svn del folder
svn commit -m ""
mkdir folder
svn add folder
svn commit -m ""
cd C:\svntest\co2
echo changed_content > folder\file.txt
svn up
svn resolve --accept working folder
svn commit -m ""
svn up folder
svn resolve --accept working folder
svn commit -m ""
И вот результат запуска script (обратите внимание на сбои фиксации в конце):
C:\>rmdir /S /Q C:\svntest
C:\>mkdir C:\svntest
C:\>cd C:\svntest
C:\svntest>svnadmin create repo
C:\svntest>svn co file:///c:/svntest/repo co1
Checked out revision 0.
C:\svntest>svn co file:///c:/svntest/repo co2
Checked out revision 0.
C:\svntest>cd co1
C:\svntest\co1>mkdir folder
C:\svntest\co1>echo content 1>folder\file.txt
C:\svntest\co1>svn add folder
A folder
A folder\file.txt
C:\svntest\co1>svn commit folder -m ""
Adding folder
Adding folder\file.txt
Transmitting file data .
Committed revision 1.
C:\svntest\co1>cd C:\svntest\co2
C:\svntest\co2>svn up
A folder
A folder\file.txt
Updated to revision 1.
C:\svntest\co2>cd C:\svntest\co1
C:\svntest\co1>svn del folder
D folder\file.txt
D folder
C:\svntest\co1>svn commit -m ""
Deleting folder
Committed revision 2.
C:\svntest\co1>mkdir folder
C:\svntest\co1>svn add folder
A folder
C:\svntest\co1>svn commit -m ""
Adding folder
Committed revision 3.
C:\svntest\co1>cd C:\svntest\co2
C:\svntest\co2>echo changed_content 1>folder\file.txt
C:\svntest\co2>svn up
C folder
At revision 3.
Summary of conflicts:
Tree conflicts: 1
C:\svntest\co2>svn resolve --accept working folder
Resolved conflicted state of 'folder'
C:\svntest\co2>svn commit -m ""
Adding folder
svn: Commit failed (details follow):
svn: Directory '/folder' is out of date
C:\svntest\co2>svn up folder
C folder
At revision 3.
Summary of conflicts:
Tree conflicts: 1
C:\svntest\co2>svn resolve --accept working folder
Resolved conflicted state of 'folder'
C:\svntest\co2>svn commit -m ""
Adding folder
svn: Commit failed (details follow):
svn: Directory '/folder' is out of date
Я понял с помощью
svn resolve --accept working PATH_TO_FILE
который должен заканчиваться:
Разрешено конфликтное состояние 'PATH_TO_FILE'
Конфликты деревьев дает хороший обзор конфликтов деревьев и их разрешения. В некоторых случаях svn revert
может также помочь, если вы потеряете все свои локальные модификации. В крайнем случае новая рабочая копия с ручным объединением меняется от "сломанной", что вернет вас в нужное русло. Определенно темная сторона подрывной деятельности.
Try
C:\svntest\co2>move folder folder.SAVE
C:\svntest\co2>svn revert folder
C:\svntest\co2>svn update
Затем Svn должен ввести новую версию каталога folder
, идентичную версии с co1
. Затем вы можете перезаписать содержимое из folder.SAVE
.
Я не могу воспроизвести то, что вы упомянули. Вот что я пробовал.
[email protected]:/tmp$ cd /tmp/
[email protected]:/tmp$ svn co http://localhost:8080/svn/stackoverflow so --username=admin
A so/trunk
A so/branches
A so/tags
Checked out revision 1.
[email protected]:/tmp$ cd so/trunk/
[email protected]:/tmp/so/trunk$ mkdir x
[email protected]:/tmp/so/trunk$ ls /tmp > x/test.txt
[email protected]:/tmp/so/trunk$ svn add x/
A x
A x/test.txt
[email protected]:/tmp/so/trunk$ svn ci -m "test"
Adding trunk/x
Adding trunk/x/test.txt
Transmitting file data .
Committed revision 2.
[email protected]:/tmp/so/trunk$ cd /tmp/
[email protected]:/tmp$ svn co http://localhost:8080/svn/stackoverflow so1 --username=admin
A so1/trunk
A so1/trunk/x
A so1/trunk/x/test.txt
A so1/branches
A so1/tags
Checked out revision 2.
[email protected]:/tmp$ cd /tmp/so1/trunk/
[email protected]:/tmp/so1/trunk$ svn remove x
D x/test.txt
D x
[email protected]:/tmp/so1/trunk$ svn ci -m ""
Deleting trunk/x
Committed revision 3.
[email protected]:/tmp/so1/trunk$ mkdir x
[email protected]:/tmp/so1/trunk$ cp ../../so/trunk/x/test.txt x
[email protected]:/tmp/so1/trunk$ ll /tmp > x/test.txt
[email protected]:/tmp/so1/trunk$ svn add x/
A x
A x/test.txt
[email protected]:/tmp/so1/trunk$ svn ci -m ""
Adding trunk/x
Adding trunk/x/test.txt
Transmitting file data .
Committed revision 4.
[email protected]:/tmp$ cd so/trunk/
[email protected]:/tmp/so/trunk$ svn up
D x
A x
A x/test.txt
Updated to revision 4.
[email protected]:/tmp/so/trunk$
По-видимому, я пробовал тот же подход, что и вы, и больше не сталкивался с какой-либо проблемой. Какую версию svn вы используете?
export REPOPATH=/tmp/svntest
[email protected]:/tmp/co2/trunk$ rm -rf $REPOPATH
[email protected]:/tmp/co2/trunk$ mkdir $REPOPATH
[email protected]:/tmp/co2/trunk$ svnadmin create $REPOPATH/repo
[email protected]:/tmp/co2/trunk$ svn co file:///$REPOPATH/repo co1
svn: Repository UUID '2d803eb8-2030-4dd3-bb6f-34ab07c74813' doesn't match expected UUID '82764ae8-6410-4565-933f-9a420cb60013'
[email protected]:/tmp/co2/trunk$ svn co file:///$REPOPATH/repo co2
svn: Repository UUID '2d803eb8-2030-4dd3-bb6f-34ab07c74813' doesn't match expected UUID '82764ae8-6410-4565-933f-9a420cb60013'
[email protected]:/tmp/co2/trunk$
[email protected]:/tmp/co2/trunk$ cd $REPOPATH/co1
bash: cd: /tmp/svntest/co1: No such file or directory
[email protected]:/tmp/co2/trunk$ mkdir folder
mkdir: cannot create directory `folder': File exists
[email protected]:/tmp/co2/trunk$ echo content > folder/file.txt
[email protected]:/tmp/co2/trunk$ svn add folder
svn: warning: 'folder' is already under version control
[email protected]:/tmp/co2/trunk$ svn commit folder -m ""
[email protected]:/tmp/co2/trunk$
[email protected]:/tmp/co2/trunk$ cd $REPOPATH/co2
bash: cd: /tmp/svntest/co2: No such file or directory
[email protected]:/tmp/co2/trunk$ svn up
At revision 10.
[email protected]:/tmp/co2/trunk$
[email protected]:/tmp/co2/trunk$ cd $REPOPATH/co1
bash: cd: /tmp/svntest/co1: No such file or directory
[email protected]:/tmp/co2/trunk$ svn del folder
svn: Use --force to override this restriction
svn: 'folder/file.txt' is not under version control
[email protected]:/tmp/co2/trunk$ svn commit -m ""
[email protected]:/tmp/co2/trunk$ mkdir folder
mkdir: cannot create directory `folder': File exists
[email protected]:/tmp/co2/trunk$ svn add folder
svn: warning: 'folder' is already under version control
[email protected]:/tmp/co2/trunk$ svn commit -m ""
[email protected]:/tmp/co2/trunk$
[email protected]:/tmp/co2/trunk$ cd $REPOPATH/co2
bash: cd: /tmp/svntest/co2: No such file or directory
[email protected]:/tmp/co2/trunk$ echo changed_content > folder\file.txt
[email protected]:/tmp/co2/trunk$ svn up
At revision 10.
[email protected]:/tmp/co2/trunk$ svn --version
svn, version 1.6.6 (r40053)
compiled Dec 12 2009, 05:04:54
Copyright (C) 2000-2009 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).
The following repository access (RA) modules are available:
* ra_neon : Module for accessing a repository via WebDAV protocol using Neon.
- handles 'http' scheme
- handles 'https' scheme
* ra_svn : Module for accessing a repository using the svn network protocol.
- with Cyrus SASL authentication
- handles 'svn' scheme
* ra_local : Module for accessing a repository on local disk.
- handles 'file' scheme
В этом конкретном случае, я думаю, вам придется вручную применить локальные изменения вручную. То есть, создайте файл исправления (svn diff > mine.patch или скопируйте файлы в другое место), верните свои изменения или разрешите их использование, затем примените патч (или скопируйте файлы обратно). Возможно, вам нужно будет скопировать базу ваших файлов обратно в обновленную папку перед внесением изменений.
Как сказал zellus, это темная сторона подрывной деятельности, и это то, что текущая реализация не может справиться. Опять же, удаление папки и добавление идентичного имени обратно не звучит совершенно правильно. Что вы ожидаете от подрывной деятельности? Что делать, если файл не воссоздается в папке? Что, если его содержимое отличается?
Попробуйте избежать ситуации вообще, не удалив папку, которую вы хотите сохранить:)