2010-10-21 12 views
45

Tu jest mój scenariusz:SVN jak rozwiązać "lokalny dodatek, przychodzące dodawanie po aktualizacji" w folderze * *?

Załóżmy mamy repo SVN o następującej treści: myfolder myfolder \ plik.txt

Teraz tworzę dwóch kas tego repo, CO1 i CO2.

W co1 modyfikujemy plik.txt. CO2 my:

  • svn delete myfolder
  • svn commit
  • Utwórz nowy folder o nazwie myfolder
  • svn dodać myfolder
  • svn commit

Teraz, gdy próbuję update in co1 Występuje konflikt drzewa:

A + C myfolder > local edit, incoming delete upon update 
M + myfolder\file.txt 

chcę zachować MójFolder i zmodyfikowany plik, więc rozwiązać konflikt drzewa:

svn resolve --accept working folder 

Teraz gdy próbuję popełnić, otrzymuję „svn: katalog«/ myfolder»jest nieaktualny” . Gdy próbuję rozwiązać ten przy użyciu svn up MójFolder, pojawia się konflikt drzewa znowu:

A + C folder > local add, incoming add upon update 
M + myfolder\file.txt 

Ok, więc staramy svn rozwiązać --accept folderu znowu działa. Ale nadal nie możemy się zobowiązać, otrzymujemy ten sam komunikat, że "svn: Directory"/myfolder "jest nieaktualny", jeśli wykonamy svn up myfolder, wracamy do ostatniego konfliktu drzew.

Jaka jest prawidłowa procedura rozwiązania tego typu konfliktu (gdy chcemy zachować mój folder i jego zmiany)?

EDIT: skrypt linia cmd Windows, aby zilustrować:

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 "" 

I tu jest wyjście działa ten skrypt (nota niepowodzenia popełniają na końcu):

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 
+0

@Azirath: zaktualizowałem moją odpowiedź, możesz mi powiedzieć, co wersja svn, z której korzystasz? –

+0

Przepraszam za długi czas reakcji, musiałem dostać to niezarejestrowane konto połączone z moim prawdziwym kontem. Zobacz moją odpowiedź w komentarzach do twojej odpowiedzi. – Ziphnor

Odpowiedz

15

Tree Conflicts daje ładny przegląd konfliktów drzew i ich rozdzielczość. W niektórych przypadkach może pomóc także svn revert, tracąc wszystkie lokalne modyfikacje. W ostateczności nowa kopia robocza z ręcznie scalonymi zmianami z "zepsutej" spowoduje powrót na właściwe tory. Zdecydowanie ciemna strona subwersji.

+1

Niestety już sprawdziłem, że przegląd konfliktów drzewa, ale niestety nie mówi mi, jak rozwiązać ten konkretny scenariusz. Napotkaliś my ten problem w naszej aplikacji, która polega na SVN, aby obsługiwać niektórych użytkowników, a nie w wierszu poleceń, a wię c bardzo chciałbym uniknĘ ... ć dziwnych hacków i pozostawić przy tym korzystanie z interfejsu SVN API. – Ziphnor

+1

Po prostu wystąpił problem z błędem konfliktu drzewa "Konflikt drzewa: lokalne dodawanie, przychodzące dodawanie po aktualizacji". Wypróbowałem opcję svn revert, którą zasugerowałeś i która działała świetnie. Całkowicie zapomniałem, że mogę to zrobić (ponieważ prawie nigdy nie muszę używać tego polecenia). Dzięki! – pthurmond

1

Nie mogę odtworzyć tego, o czym wspomniałeś. Oto, co próbowałem.

[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$ 

Podobno próbowałem tego samego podejścia, które zrobiłeś i nie napotkasz żadnego problemu ponownie. Jakiej wersji svn używasz?

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 
+0

Dodałem skrypt do oryginalnego wpisu, aby zilustrować mój scenariusz bardziej szczegółowo. – Ziphnor

+0

Różnica wydaje się, że w moim scenariuszu plik jest modyfikowany w kopii roboczej, która wykonuje aktualizację ("tak"), a nie kopii roboczej, która wykonuje usuwanie ("so1"), jak ma to miejsce w twoim skrypcie. – Ziphnor

+0

Nie jestem pewien, co dzieje się na wyjściu, wydaje się, że dostajesz dużo błędów? – Ziphnor

0

W tym konkretnym przypadku, myślę, że będziesz musiał ręcznie zastosować lokalne zmiany. To znaczy, stwórz plik łatki (svn diff> mine.poprawkę lub skopiuj pliki gdzie indziej), przywróć zmiany lub rozwiąż je, używając ich, następnie zastosuj poprawkę (lub skopiuj pliki z powrotem). Być może będziesz musiał svn skopiować bazę swoich plików z powrotem do odtworzonego folderu przed zastosowaniem zmian.

Tak jak powiedział zellus, jest to ciemna strona subwersji i jest to coś, czego obecna implementacja nie jest w stanie obsłużyć. Z drugiej strony usunięcie folderu i dodanie identycznie nazwanego z powrotem nie brzmi całkiem poprawnie. Czego można się spodziewać po działalności wywrotowej? Co się stanie, jeśli plik nie zostanie ponownie utworzony w folderze? Co, jeśli jego zawartość jest inna?

Spróbuj uniknąć sytuacji całkowicie przez nie usuwając folder, który chcesz zachować :)

+0

Jak wspomniano wcześniej, napotykamy ten problem w naszych aplikacjach wykorzystujących SVN (poprzez SharpSVN) jako wewnętrzny system kontroli wersji dla współdzielonych danych użytkownika. W naszym scenariuszu to nie ten sam użytkownik, który usuwa folder, a raczej jego usunięcie po stronie serwera, które powoduje, że następny klient aktualizuje się, aby ponownie utworzyć folder. Po prostu oczekiwałem, że SVN da mi sposób na określenie, że aktualna treść mojej kopii roboczej została scalona z daną wersją na serwerze, co pozwoliło mi zatwierdzić wynik. – Ziphnor

2

Spróbuj

C:\svntest\co2>move folder folder.SAVE 
C:\svntest\co2>svn revert folder 
C:\svntest\co2>svn update 

SVN powinien następnie wnieść w świeżej wersji folder katalogu identyczny z jednym z co1. Możesz następnie zastąpić zawartością z folder.SAVE.

33

zorientowali się z

svn resolve --accept working PATH_TO_FILE 

który powinien skończyć z:

Rozwiązane skonfliktowany stan 'ścieżka_do_pliku'

Powiązane problemy