2010-10-21 23 views
45

Đây là kịch bản của tôi:SVN cách giải quyết "thêm địa phương, gửi đến khi cập nhật" trên thư mục * *?

Giả sử chúng ta có một repo SVN với nội dung sau: Myfolder Myfolder \ file.txt

Bây giờ tôi có thể tạo hai Thanh toán của repo này, co1 và co2.

Trong co1, chúng tôi sửa đổi tệp.txt. Trong co2 chúng tôi:

  • svn xóa Myfolder
  • svn cam
  • Tạo một thư mục mới có tên Myfolder
  • svn thêm Myfolder
  • svn cam

Bây giờ nếu tôi cố gắng một cập nhật trong co1 Tôi nhận được xung đột về cây:

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

tôi muốn giữ Myfolder và tập tin được sửa đổi, vì vậy tôi giải quyết cuộc xung đột cây:

svn resolve --accept working folder 

Bây giờ nếu tôi cố gắng cam kết, tôi nhận được "svn: thư mục '/ Myfolder' đã cũ" . Nếu tôi cố gắng giải quyết sử dụng svn lên Myfolder này, tôi nhận được một cuộc xung đột cây một lần nữa:

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

Được rồi, vì vậy chúng tôi cố gắng giải quyết svn --accept thư mục hoạt động trở lại. Nhưng chúng tôi vẫn không thể cam kết, chúng tôi nhận được cùng một thông báo rằng "svn: Directory '/ myfolder" đã lỗi thời ", nếu chúng ta làm svn up myfolder, chúng ta sẽ quay trở lại cuộc xung đột cây cuối cùng.

Quy trình chính xác để giải quyết loại xung đột này là gì (khi chúng tôi muốn giữ thư mục và các thay đổi của nó)?

EDIT: Windows dòng cmd kịch bản để minh họa:

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

Và đây là sản phẩm của chạy kịch bản đó (lưu ý những thất bại cam kết ở cuối):

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: Tôi cập nhật câu trả lời của tôi, có thể bạn cho tôi biết những gì phiên bản svn bạn đang sử dụng? –

+0

Xin lỗi vì thời gian phản hồi dài, tôi phải lấy tài khoản chưa đăng ký này được hợp nhất với tài khoản thực của tôi. Xem câu trả lời của tôi trong phần bình luận cho câu trả lời của bạn. – Ziphnor

Trả lời

15

Tree Conflicts đưa ra một đẹp tổng quan về xung đột cây và độ phân giải của chúng. Trong một số trường hợp, svn revert cũng có thể trợ giúp, trong khi mất tất cả các sửa đổi cục bộ của bạn. Như phương sách cuối cùng, một bản sao làm việc mới với các thay đổi được hợp nhất theo cách thủ công từ bản sao đã bị hỏng sẽ đưa bạn trở lại đúng hướng. Chắc chắn mặt tối của sự lật đổ.

+1

Thật không may tôi đã kiểm tra tổng quan về xung đột cây, nhưng thật đáng buồn nó không cho tôi biết làm thế nào để giải quyết kịch bản cụ thể này. Tôi gặp phải vấn đề này trong ứng dụng của chúng tôi dựa trên SVN để xử lý người dùng nhất định, không phải trên dòng lệnh, và do đó tôi thực sự muốn tránh các hack lạ và dính vào việc sử dụng SVN API. – Ziphnor

+1

Tôi vừa gặp sự cố với lỗi xung đột của cây về "Xung đột cây: thêm địa phương, thêm vào khi cập nhật". Tôi đã thử tùy chọn hoàn nguyên svn mà bạn đề xuất và nó hoạt động tốt. Tôi hoàn toàn quên tôi có thể làm điều đó (vì tôi hầu như không bao giờ phải sử dụng lệnh đó). Cảm ơn! – pthurmond

1

Tôi không thể tái tạo những gì bạn đã đề cập. Đây là những gì tôi đã thử.

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

Dường như tôi đã thử phương pháp tương tự mà bạn đã làm và không gặp lại bất kỳ vấn đề nào. Bạn đang sử dụng phiên bản svn nào?

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

Tôi đã thêm tập lệnh vào bài đăng gốc để minh họa cho kịch bản của mình chi tiết hơn. – Ziphnor

+0

Sự khác biệt có vẻ là trong kịch bản của tôi tệp được sửa đổi trong bản sao làm việc thực hiện cập nhật ("so"), không phải bản sao làm việc thực hiện xóa ("so1") như trường hợp trong tập lệnh của bạn. – Ziphnor

+0

Im không chắc chắn những gì đang xảy ra trong đầu ra của bạn, bạn dường như nhận được rất nhiều lỗi? – Ziphnor

0

Trong trường hợp cụ thể này, tôi nghĩ bạn sẽ phải áp dụng lại các thay đổi cục bộ theo cách thủ công. Tức là, tạo một tệp vá (svn diff> mine).vá, hoặc sao chép các tập tin ở một nơi khác), hoàn nguyên các thay đổi của bạn hoặc giải quyết bằng cách sử dụng chúng, sau đó áp dụng các bản vá (hoặc sao chép các tập tin trở lại). Có lẽ bạn sẽ cần phải svn sao chép cơ sở của các tập tin của bạn trở lại trong thư mục tái tạo trước khi áp dụng thay đổi của bạn.

Giống như zellus đã nói, đó là mặt tối của lật đổ, và đây là điều mà việc triển khai hiện tại không thể xử lý được. Sau đó, một lần nữa, việc xóa một thư mục và thêm một tên được đặt tên trùng lặp lại không có vẻ khá đúng. Những gì bạn mong đợi subversion để làm gì? Điều gì xảy ra nếu tệp không được tạo lại trong thư mục? Điều gì sẽ xảy ra nếu nội dung của nó khác?

Cố gắng tránh tình hình hoàn toàn bằng cách không xóa một thư mục mà bạn muốn giữ lại :)

+0

Như đã đề cập trước đây, chúng tôi gặp phải vấn đề này trong các ứng dụng của chúng tôi sử dụng SVN (thông qua SharpSVN) như một hệ thống phiên bản nội bộ cho dữ liệu người dùng được chia sẻ. Trong kịch bản của chúng tôi, nó không phải là cùng một người dùng xóa thư mục, thay vào đó là xóa phía máy chủ khiến khách hàng tiếp theo cập nhật để tạo lại thư mục. Tôi chỉ đơn giản là mong đợi SVN để cho tôi một cách để xác định rằng nội dung hiện tại của bản sao làm việc của tôi đã được sáp nhập với bản sửa đổi nhất định trên máy chủ, do đó cho phép tôi cam kết kết quả. – Ziphnor

2

Hãy thử

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

SVN thì nên mang theo trong một phiên bản folder thư mục tươi giống hệt với một từ co1. Sau đó, bạn có thể ghi đè lên nội dung từ folder.SAVE.

33

tôi đã tìm ra với

svn resolve --accept working PATH_TO_FILE 

mà nên kết thúc với:

giải quyết tình trạng mâu thuẫn của 'PATH_TO_FILE'

Các vấn đề liên quan