2011-02-03 13 views
7

Tôi có yêu cầu tạo một bản dựng dựa trên thẻ hoặc chi nhánh. Vì vậy, tôi đã tự động hóa quy trình xây dựng của mình để chuyển sang thẻ hoặc chi nhánh bất cứ khi nào họ yêu cầu Xây dựng. Iam sử dụng lệnh chuyển đổi svn để làm cho các điểm sao chép làm việc để thẻ hoặc chi nhánh từ bản sao làm việc thân cây. Vấn đề là: Nếu có các thư mục mới được thêm vào trong bản sửa đổi đầu, chúng sẽ không bị xóa khỏi bản sao làm việc. Chúng vẫn không được phiên bản trong bản sao làm việc, nhưng các thư mục không phiên bản trong bản dựng gây ra nhiều vấn đề. Làm thế nào để tránh vấn đề này? Có tùy chọn nào để tránh các tệp không phiên bản trong khi sử dụng lệnh chuyển đổi svn hay không.SVN Switch không xóa các thư mục/tệp trong tác phẩm không có trong khi chuyển sang thẻ hoặc chi nhánh

Trả lời

2

Chuyển đổi SVN sẽ không xóa các tệp không phiên bản như bạn đã tìm thấy.

Cách tôi xử lý nó trong quá trình xây dựng của tôi (Cruise Control) là luôn luôn xóa toàn bộ thư mục làm việc sau mỗi lần xây dựng. Sau đó, khi quá trình xây dựng của bạn làm một SVN nhận được, nó sẽ được vào một thư mục trống rỗng và sẽ không có xung đột.

BTW đây là lý do tại sao bạn nên sử dụng một máy chủ xây dựng riêng biệt - sau đó bạn sẽ không có công việc dev không được cam kết can thiệp vào bản dựng.

+0

tôi nghĩ rằng u đã không nhận được câu hỏi của tôi. Sửa đổi đầu sẽ có một số thư mục hoặc tập tin cam kết cho repo, trong khi chuyển đổi trở lại, những thư mục shuld sẽ bị xóa khỏi bản sao làm việc.sau khi chuyển sang nhánh/thẻ, lệnh sao chép hoạt động bằng với nhánh mới được chuyển đổi hoặc Thẻ – sandy

+0

Tôi nghĩ bạn đã bỏ lỡ ý của mình .. Nếu bạn xóa tất cả khỏi thư mục hoạt động trước khi chuyển đổi, thì điều đó không quan trọng trước đó, hoặc những gì hiện đang cam kết với bất kỳ chi nhánh/thẻ khác. Bạn sẽ chỉ có mã cho chi nhánh bạn muốn xây dựng. –

+0

sau khi xóa, tôi có thể làm svn chuyển đổi, thay vì đó tôi có thể làm svn checkout. sao chép toàn bộ điểm có lệnh chuyển đổi svn. Đúng nếu tôi đã sai lầm? – sandy

1

Hai năm sau ...

Sau một vài mày mò xung quanh và nhìn thấy câu hỏi của bạn (Sandy) câu trả lời là, vâng, Switch nên xóa thư mục. Tôi đã gặp vấn đề tương tự và đã tìm ra vấn đề này.

Để rõ ràng, vấn đề như tôi hiểu đó là bạn thêm một thư mục/thư mục vào chi nhánh của bạn, sau đó chuyển về Trunk. Thư mục được thêm này sẽ bị xóa khi chuyển trở lại.

Tôi thấy rằng Tortoise SVN đang cố xóa thư mục nhưng không có lỗi và không thực sự xóa thư mục. Hóa ra có một số loại vấn đề quyền. Khi tôi đã xóa thư mục một cách thủ công trong khi trên Trunk, việc chuyển đổi qua lại sẽ tạo ra kết quả mong đợi; thư mục bị xóa.

4

không có lỗi nhưng bạn phải đảm bảo rằng không gian làm việc thực sự sạch sẽ trước khi chuyển đổi. Nếu nó được sạch sẽ, chuyển đổi xóa/tạo ra các tập tin và thư mục có mặt trong chỉ có một phiên bản. Để kết thúc này, hướng dẫn sử dụng subversion 1.6 nói:

“Chuyển đổi” bản sao đang hoạt động không có sửa đổi cục bộ cho một kết quả khác trong bản sao làm việc giống như khi bạn thực hiện thanh toán mới.

Tôi vừa thử nghiệm điều này với kho lưu trữ thử nghiệm mới được tạo. Nếu mặt khác có những sửa đổi cục bộ trong không gian làm việc hiện tại, svn sẽ không loại bỏ chúng. svn là khá bảo thủ với sự tôn trọng này. Ví dụ. Tôi đã tạo một thư mục dir trên thân cây và cam kết nó. Sau đó, tôi tạo một tập tin sao lưu dir/file.~1~. Nó không được báo cáo bởi svn st*~ bị bỏ qua trên toàn cầu với cấu hình của tôi. Khi tôi chuyển trở lại một chi nhánh svn nên đã xóa dir nhưng điều này sẽ xóa các tập tin sao lưu, do đó, svn đã không làm điều đó. Nó giữ thư mục như một sửa đổi cục bộ.

lưu ý phụ: khi chuyển sang lại thân cây svn báo cáo lỗi vì dir khi sửa đổi cục bộ trên nhánh bị xung đột với phiên bản dir trên thân cây. --force giải quyết được sự cố đó.

+0

Bạn chưa đọc đủ vấn đề. "svn add", và sau đó "svn switch" vào một phiên bản cũ không gây ra các tập tin chưa được đánh giá, nhưng chúng sẽ bị xóa. Với một thanh toán sạch, "svn chuyển đổi" giữa các ngành khác nhau và các thẻ không nên gây ra xung đột - nhưng thực sự nó gây ra xung đột. Có lẽ tôi nên cố gắng tạo ra một kịch bản có thể tái tạo ... – tobixen

+0

Tôi đã thử nghiệm ngay bây giờ với một repo sạch sẽ và trống rỗng, thêm một số tập tin và thư mục dần dần, và thực hiện gắn thẻ - nhưng SVN đã làm điều đúng và xóa các tập tin mới hơn. Kỳ dị. Tôi khá chắc chắn rằng tôi đã quan sát vấn đề tuần trước, và các vấn đề đã được chắc chắn không phải do các tập tin được thêm vào địa phương. Tôi sẽ chơi nhiều hơn một chút với điều này. – tobixen

+0

Ok, tôi nghĩ có thể bạn đang ở một nơi nào đó ở đây. Nghiên cứu của tôi ở đây quá dài để phù hợp với nhận xét, vì vậy tôi sẽ viết một câu trả lời riêng. – tobixen

2

Mọi thứ hoạt động giống như chúng, ít nhất là trong svn 1.6.11 trở lên. Tuy nhiên, một quá trình xây dựng khá có khả năng để lại đằng sau các tập tin không được đánh giá. Đó có thể là minh bạch về "trạng thái svn" do cài đặt SVNIGNORE.Điều này có thể gây ra rắc rối khi người ta mong đợi svn để loại bỏ toàn bộ thư mục.

Tôi đã thực hiện một số kiểm tra - tôi đã thiết lập một kho lưu trữ mới và trống, tạo một thư mục thân cây và thẻ ở đó, thêm một và một tệp trong khi gắn thẻ nó. (các phần mã dưới đây không bao gồm đầu ra và lỗi do SVN ném ra, bạn được khuyến khích sao chép nó vào một cửa sổ đầu cuối và xem liệu bạn có thể sao chép hành vi) hay không.

mkdir /tmp/workdir/ 
cd /tmp/workdir 
svnadmin create /tmp/foobar 
svn checkout file:///tmp/foobar/ 
svn mkdir foobar/tags 
svn mkdir foobar/trunk 
cd foobar 
svn commit -m "trunk and tags" 
## NOTE: in svn 1.8 and higher, it's needed with a --ignore-ancestry option below 
svn switch file:///tmp/foobar/trunk 

(và ở đây chúng ta đã có thể thấy rằng nó đang làm điều đúng đắn - xóa các thẻ và các thư mục con thân)

touch file1 
svn add file1 
svn commit -m "added file1" 
svn cp -m "file1 in tag1" . file:///tmp/foobar/tags/tag1 

Và sau đó một lần nữa ...

touch file2 
svn add file2 
svn commit -m "added file2" 
svn cp -m "file2 in tag2" . file:///tmp/foobar/tags/tag2 

Hãy rõ ràng xóa tệp1 từ tag3

svn rm file1 
svn commit -m "deleted file1" 
svn cp -m "file1 removed from tag3" file:///tmp/foobar/trunk/ file:///tmp/foobar/tags/tag3/ 

... và một thư mục mới cũng ...

svn mkdir dir1 
touch dir1/file3 
svn add dir1/file3 
svn commit -m "added dir1/file3" 
svn cp -m "dir1/file3 in tag4" file:///tmp/foobar/trunk file:///tmp/foobar/tags/tag4/ 

... và chúng ta hãy xóa nó trong tag5 ...

svn rm dir1 
svn commit -m "removed dir1/file3" 
svn cp -m "dir1/file3 removed in tag5" file:///tmp/foobar/trunk file:///tmp/foobar/tags/tag5/ 

... và chúng ta hãy kiểm tra việc chuyển đổi các công trình. ..

svn switch file:///tmp/foobar/tags/tag1 
svn switch file:///tmp/foobar/tags/tag2 
svn switch file:///tmp/foobar/tags/tag3 
svn switch file:///tmp/foobar/tags/tag4 
svn switch file:///tmp/foobar/tags/tag5 
svn switch file:///tmp/foobar/tags/tag4 

... không có vấn đề gì. Nhưng, nói rằng tôi sửa đổi dir1/file3 với emacs - nó thường sẽ làm cho một tập tin sao lưu:

touch dir1/file3~ 

này không hiển thị trên "tình trạng svn" do thiết lập mặc định SVNIGNORE ...

svn status 

nhưng nó đủ để phá vỡ mọi thứ:

svn switch file:///tmp/foobar/tags/tag5 
svn status 
svn switch file:///tmp/foobar/tags/tag4 

lệnh đầu tiên chỉ ra rằng dir1 bị xóa, nhưng do file unrevisioned thư mục bị đứng.

"svn trở lại" tiếc là không gỡ bỏ những file unrevisioned ...

svn revert -R . 
svn switch file:///tmp/foobar/tags/tag5 
svn status 
svn switch file:///tmp/foobar/tags/tag4 

"làm sạch" có thể và không thể làm việc, tùy thuộc vào môi trường. Tất nhiên, người ta có thể tạo một kịch bản để xóa nó, tức là như thế này:

rm -rf $(svn status --no-ignore | grep -E '^\?' | awk ' { print $2 ; }') 
svn switch file:///tmp/foobar/tags/tag4 

Xin lưu ý rằng lệnh trên có thể làm những điều xấu khi gặp phải tên tập tin có dấu cách.

Một cũng có thể tránh được một số thông báo lỗi trên bằng cách sử dụng "--force":

touch dir1/file3~ 
svn switch --force file:///tmp/foobar/tags/tag5 
svn switch --force file:///tmp/foobar/tags/tag4 

Lưu ý rằng mydir1/file3 ~ không bao giờ bị xóa, nhưng điều đó công tắc cuối cùng sẽ không thất bại

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