web-dev-qa-db-ja.com

SVNは*フォルダ*で「ローカル追加、更新時に着信追加」を解決する方法?

私のシナリオは次のとおりです。

次のコンテンツを含むSVNリポジトリがあるとします:myfolder myfolder\file.txt

ここで、このレポの2つのチェックアウト、co1とco2を作成します。

Co1では、file.txtを変更します。 co2では:

  • svn delete myfolder
  • sVNコミット
  • Myfolderという名前の新しいフォルダーを作成します
  • svn add myfolder
  • sVNコミット

今co1で更新しようとすると、ツリーの競合が発生します。

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

Myfolderと変更されたファイルを保持したいので、ツリーの競合を解決します。

svn resolve --accept working folder

コミットしようとすると、「svn:Directory '/ myfolder' is out of date」になります。 svn up myfolderを使用してこれを解決しようとすると、再びツリーの競合が発生します。

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

わかりましたので、svn resolve --accept作業フォルダーを再試行します。しかし、コミットできません。「svn:Directory '/ myfolder' is out of date」という同じメッセージが表示されます。myfolderをsvnすると、最後のツリーの競合に戻ります。

このタイプの競合を解決する正しい手順は何ですか(myfolderとその変更を保持したい場合)?

編集:Windowsのコマンドラインスクリプトを説明する:

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

そして、ここにそのスクリプトを実行した出力があります(最後にコミットの失敗に注意してください):

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
48
Ziphnor

と思いつきました

svn resolve --accept working  PATH_TO_FILE

最終的には次のようになります。

「PATH_TO_FILE」の競合状態の解決

41
augusto

Tree Conflicts は、tree conflictsの概要とその解決策を示します。ある場合には svn revertも同様に役立つ可能性がありますが、ローカルの変更はすべて失われます。最後の手段として、「壊れた」変更から手動でマージされた変更を含む新しい作業コピーを使用すると、軌道に戻すことができます。間違いなくSubversionのダークサイド。

16
zellus

試して

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

Svnはco1からのものと同一の新しいfolderディレクトリバージョンを持ち込む必要があります。その後、folder.SAVEのコンテンツで上書きできます。

4
hlovdal

この特定のケースでは、ローカルの変更を手動で再適用する必要があると思います。つまり、パッチファイルを作成し(svn diff> mine.patch、または他の場所にファイルをコピー)、変更を元に戻すか、それらを使用して解決してから、パッチを適用(またはファイルをコピー)します。おそらく、変更を適用する前に、再作成したフォルダーにファイルのベースをsvnコピーして戻す必要があります。

Zellusが言ったように、それはSubversionの暗黒面であり、これは現在の実装では処理できないものです。この場合も、フォルダーを削除し、同じ名前のフォルダーを追加して戻すのは適切ではありません。 Subversionに何を期待しますか?ファイルがフォルダー内で再作成されない場合はどうなりますか?その内容が異なる場合はどうなりますか?

保持したいフォルダを削除しないことで、状況を完全に回避してみてください:)

0
Mikkel Blanné