2008-10-09 23 views
25

Tôi gặp sự cố sau khi sử dụng subversion:Subversion không hợp nhất các thay đổi thành các tệp được đổi tên?

Tôi hiện đang làm việc trong dự án và lập kế hoạch tái cấu trúc (bao gồm đổi tên tệp hoặc di chuyển tệp sang các thư mục khác nhau).

Đồng thời một người khác đang làm việc trên cùng một dự án trên chi nhánh.

Có lúc tôi muốn hợp nhất các thay đổi được thực hiện trên nhánh trở lại thân cây. Điều đó bao gồm các thay đổi được thực hiện cho các tệp (trên nhánh) đã được đổi tên trên thân cây.

Tôi đã thực hiện một số thử nghiệm và có vẻ như một trong hai phiên bản phụ không có khả năng theo dõi những thay đổi này hoặc tôi đang thiếu một số thứ (đó là những gì tôi hy vọng). Tôi đã thử nghiệm này sử dụng đoạn mã sau (nên làm việc trong bash, giả định một kho svn tại "http://myserver/svn/sandbox"):

svn co http://myserver/svn/sandbox 

cd sandbox/ 

mkdir -p MyProject/trunk MyProject/branches MyProject/tags 

cat - <<EOF >MyProject/trunk/FileOne.txt 
Test 
1 
2 
EOF 

svn add MyProject 

svn commit -m "init" 

# create a branch 
svn copy http://myserver/svn/sandbox/MyProject/trunk http://myserver/svn/sandbox/MyProject/branches/Branch_1 svn copy http://myserver/svn/sandbox/MyProject/trunk http://myserver/svn/sandbox/MyProject/branches/Branch_1 

# rename the file 
svn move MyProject/trunk/FileOne.txt MyProject/trunk/FileTwo.txt 

svn commit -m "renamed file" 

svn update 

# change the content of FileOne in branch 

cat - <<EOF >MyProject/branches/Branch_1/FileOne.txt 
Test 
2 
3 
EOF 

svn commit -m "changed branch" 

# I now try to merge the changes in FileOne back to FileTwo 
cd MyProject/trunk/ 
svn merge -r1:HEAD http://myserver/svn/sandbox/MyProject/branches/Branch_1 
# but this yields the following message: 
# Skipped missing target: 'FileOne.txt' 

Any help is appreciated rất nhiều.

Edit: Có lẽ quá trình đề xuất bởi mikegrb thể bằng hơi tự động bằng cách đầu tiên tạo ra một bản đồ các tập tin đổi tên (old-> mới) từ lệnh svn log trên thân cây:

svn log -v 
------------------------------------------------------------------------ 
r33 | sme | 2008-10-09 15:17:54 +0200 (Do, 09 Okt 2008) | 1 line 
Changed paths: 
    D /MyProject/trunk/FileOne.txt 
    A /MyProject/trunk/FileTwo.txt (from /MyProject/trunk/FileOne.txt:31) 


resulting map: {FileOne.txt => FileTwo.txt} 

Bây giờ sử dụng này bản đồ để thay đổi tên tệp trong tệp bản vá được tạo trên nhánh.

gốc:

Index: FileOne.txt 
=================================================================== 
--- FileOne.txt (.../trunk)  (revision 31) 
+++ FileOne.txt (.../branches/Branch_1) (revision 34) 
@@ -1,3 +1,3 @@ 
Test 
-1 
2 
+3 

chỉnh sửa:

Index: FileTwo.txt 
=================================================================== 
--- FileTwo.txt (.../trunk)  (revision 31) 
+++ FileTwo.txt (.../branches/Branch_1) (revision 34) 
@@ -1,3 +1,3 @@ 
Test 
-1 
2 
+3 

Chỉ cần một ý tưởng, đã không thực hiện nó được nêu ra.

Trả lời

22

Tôi nghĩ rằng đây là một lật đổ hiện bug - nhưng đừng nín thở, được mở kể từ năm 2002.

+2

Có vẻ như họ đã đẩy lỗi này ra phiên bản 1.8. Đó chỉ là một cách khác để nói 'chưa'. Kể từ khi nó được mở từ năm 2002 nó bắt đầu trông giống nhiều hơn và nhiều hơn như 'không bao giờ'. –

+1

@deft_code Lỗi này đã được sửa chưa? Tôi nghĩ rằng tôi có thể trải qua một cái gì đó tương tự ngay bây giờ. Tôi đổi tên một vài tập tin bằng cách sử dụng chức năng đổi tên Tortoisesvns, và bây giờ khi tôi cố gắng hợp nhất từ ​​thân cây đến chi nhánh của tôi (để kiểm tra nếu biên dịch của nó trước khi tái nhập vào thân cây) nó nói "bỏ qua mục tiêu bị mất" – TravisG

+0

@TravisG - lỗi đề cập đến có thể được cố định trong 1.8, có thể đã xuất hiện trong tuần này (có bản phát hành git, không chắc chắn về phiên bản). Tôi vẫn còn trên 1,7 bản thân mình ... bạn đang ở phiên bản nào? –

1

Có thể bạn sẽ phải đổi tên chúng trong nhánh. Bạn có thể hợp nhất bản sửa đổi đã đổi tên chúng từ thân cây thành chi nhánh không? Điều đó có thể tiết kiệm thời gian. Nếu không, bạn sẽ phải đổi tên chúng trong nhánh. Sau đó thử hợp nhất trở lại thân cây.

11

Thật không may, đây là một trong những hạn chế của sự lật đổ. Khi gần đây chúng tôi đã có một tình huống tương tự để đối phó với giải pháp của chúng tôi là tạo ra một điểm khác biệt lớn cho chi nhánh và sau đó đi qua tập tin đó bằng tập tin vá thủ công. Các tệp đã được đổi tên và không tìm thấy sẽ khiến bản vá nhắc tên tệp bị vá. Rất phụ tối ưu. Xem ra cho các tập tin nhị phân mà sẽ không hiển thị trong diff. Đây là một trong những yếu tố lớn khiến chúng tôi đánh giá các hệ thống kiểm soát phiên bản khác và cuối cùng quyết định chuyển sang git.

+4

về mặt kỹ thuật Git cũng không có hỗ trợ đổi tên thực sự. Tuy nhiên họ thực hiện đoán, đó là tốt hơn sau đó SVN. Bazaar là VCS nguồn mở duy nhất hỗ trợ đổi tên thực sự. –

1

Một cách giải quyết là để đồng bộ các chi nhánh với thân cây trước khi đồng bộ thân cây với các chi nhánh.

Sự khác biệt là thân cây đến nhánh có tệp để áp dụng thay đổi (di chuyển) đến, trong khi chi nhánh tới thân cây không có tệp để áp dụng thay đổi (sửa đổi). Điều này đơn giản là vì SVN dường như không theo dõi các tập tin được di chuyển/đổi tên. Tôi không biết tại sao nó không, hy vọng có một lý do chính đáng cho nó.

Ví dụ:

  • rev 1: /trunk/foo.txt chuyển đến /trunk/folder/foo.txt
  • rev 2: /branches/mybranch/foo.txt được sửa đổi

Làm cách nào để hợp nhất các thay đổi foo.txt vào thân cây?

Giải pháp:

  1. Merge tất cả các phiên bản từ thân cây để mybranch và cam kết. Điều này sẽ khiến foo.txt di chuyển.
  2. Hợp nhất tất cả các sửa đổi từ mybranch đến thân cây. Điều này sẽ cập nhật nội dung của foo.txt, vì bây giờ chúng có cùng đường dẫn.

Lưu ý: Nếu bạn đã di chuyển/đổi tên các tệp khác nhau trên cả thân cây và mybranch, thì bạn đang ở trong một chuyến đi. Tôi đoán bạn sẽ phải chọn lọc hợp nhất trong những thay đổi để bạn làm di chuyển/đổi tên đầu tiên trong cả hai hướng, sau đó hợp nhất thay đổi.

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