Xóa các thuộc tính svn: mergeinfo không cần thiết


136

Khi tôi hợp nhất nội dung trong kho lưu trữ, Subversion muốn thêm / thay đổi nhiều svn:mergeinfothuộc tính thành các tệp hoàn toàn không liên quan đến những thứ mà tôi muốn hợp nhất.

Các câu hỏi về hành vi này đã được hỏi trước đây tại đây về Stack Overflow:

Từ những gì tôi hiểu từ các chủ đề được đề cập ở trên, có vẻ như rất nhiều tệp trong kho lưu trữ của tôi có svn:mergeinfothuộc tính rõ ràng về chúng, khi chúng không nên. Lời khuyên là giảm số lượng và chỉ đặt các thuộc tính đó vào các tệp / thư mục có liên quan.

Vì vậy, bây giờ câu hỏi của tôi: làm thế nào tôi có thể dễ dàng loại bỏ các thuộc tính không cần thiết? Tôi đang sử dụng TortoiseSVN, nhưng tôi miễn cưỡng tự kiểm tra / sửa hàng trăm tệp. Có cách nào dễ dàng hơn để loại bỏ những svn:mergeinfotài sản không cần thiết ?

PS Tôi không tìm kiếm mã API C ++ SVN.

Câu trả lời:


142

Đây là một cách khác để xóa tất cả các thuộc tính của cây con svn: mergeinfo nhưng không có trong thư mục gốc (điều này là cần thiết để phân nhánh hoạt động chính xác).

Từ gốc của dự án làm:

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"

57
Hoặc, đừng làm điều đó trên thư mục gốc "svn propdel -R svn: mergeinfo ./*"
Jeremyweir

3
"svn propdel -R svn: mergeinfo ./* ./.[ucci.[*" nếu bạn cũng có các tập tin ẩn "dot" / * ix, có lẽ không phải là vấn đề đối với người dùng Windows cho mỗi câu hỏi.
Peter

3
triệt tiêu đầu ra tăng tốc: "svn propdel svn: mergeinfo -R> nul" (hoặc> / dev / null sử dụng Linux)
bebbo

2
@Jeremy Weir Ý bạn là gì khi "đừng làm điều đó trên thư mục gốc"? Từ đâu đến đó? Bạn có rất nhiều ý kiến ​​trái chiều về nhận xét đó, nhưng tôi không thấy sự thay thế.
TT.

3
@TT. Tôi nghĩ rằng ý tưởng là chỉ cần đi đến thư mục có tất cả các thông tin hợp nhất lộn xộn và thực hiện nó từ đó, vì vậy bạn không phải hoàn nguyên thư mục gốc. Bạn không muốn gây rối với mergeinfo của root.
Jeremy Weir

15

Đây là một cách để xóa tất cả các thuộc tính svn: mergeinfo. Chạy nó bên trong thư mục gốc của kho lưu trữ của bạn:

svn propget svn:mergeinfo --depth=infinity 
    | grep -v "^/"
    | grep -v "^\."   
    | cut -d- -f1 
    | xargs svn propdel svn:mergeinfo

Tất cả trong một dòng để dễ dàng sao chép / dán:

svn propget svn:mergeinfo --depth=infinity | grep -v "^/" | grep -v "^\." | cut -d- -f1 | xargs svn propdel svn:mergeinfo

Để xem trước tập tin nào sẽ có hiệu lực trước khi bạn chạy nó, hãy thay đổi "propdel" cuối cùng thành "propget" hoặc loại bỏ hoàn toàn đường ống xargs cuối cùng.


2
Hoạt động với dấu gạch nối trong tệp: svn propget -R svn: mergeinfo | grep -v "^ /" | grep -v "^ \." | cắt "-d" -f1 | xargs svn propdel svn: mergeinfo
Squirrel

12

Như đã đề cập trong chủ đề này :

  • Hầu hết các mergeinfo trống ("trống") có thể được gây ra bởi bản sao làm việc để sao chép / di chuyển bản sao làm việc trong đó mục nguồn không có mergeinfo rõ ràng. Sử dụng propdel có thể là giải pháp trừ khi bạn đang sử dụng 1.6 SVN: vì 1.5.5 các bản sao WC-to-WC này không còn tạo mergeinfo trống ở đích
  • một hoạt động tái cấu trúc di chuyển (đổi tên) svn trước đó cũng có thể truyền bá mergeinfo, thay vì để chúng ở thư mục gốc
  • có một vấn đề về bộ nhớ tiềm ẩn, được theo dõi bởi trường hợp 3393 sẽ được khắc phục trong phiên bản 1.6.2 sắp tới và được chuyển ngược lại trong 1.5

6

Vì tôi không tự tin với svn:merge-infoviệc xóa thuộc tính mù , tôi đã triển khai một công cụ để phân tích tình hình hiện tại trên một bản sao đang hoạt động và loại bỏ càng nhiều bản sửa đổi hợp nhất càng tốt khỏi các thuộc tính thông tin hợp nhất không root. Sau khi kiểm tra và kiểm soát bổ sung của con người, những thay đổi trên bản sao làm việc có thể được cam kết.

Đây là: svn-clean-mergeinfo

Đừng ngần ngại báo cáo bất kỳ vấn đề nào về việc sử dụng nó để cải thiện nó.

Subversion 1.10 giới thiệu một công cụ mới dành riêng cho nhiệm vụ đó: svn-mergeinfo-normalizer


2
Công cụ này rất tốt cho việc hợp nhất các thuộc tính thông tin hợp nhất, giống như các loại được tạo bằng thư mục con một phần hợp nhất mà nhiều nhà phát triển phối hợp hoàn hảo hơn trong một nhóm lớn có thể tạo ra. Công cụ dường như có vấn đề với các tệp không tồn tại ở mọi chi nhánh, tôi nhận được các thuộc tính thông tin hợp nhất còn sót lại trên các tệp cho biết các sửa đổi trên các nhánh trong đó tệp không bao giờ tồn tại.
davenpcj

Tôi đồng ý rằng nó không hoàn hảo ... đó là lý do tại sao "kiểm tra và kiểm soát con người" vẫn được yêu cầu. Trong trường hợp của bạn, nếu bạn đã xác định các sửa đổi không liên quan trong các thuộc tính thông tin hợp nhất, bạn có thể xóa các sửa đổi này hoặc toàn bộ thuộc tính svn: merge-thông tin trên các tệp đó trước khi cam kết. Vui lòng sử dụng github để yêu cầu cải tiến.
Yves Martin

4

Tôi biết đã được một lúc, nhưng tôi gặp phải một vấn đề tương tự. Tôi đang sử dụng TortoiseSVN 1.6.7. Nó chỉ xảy ra rằng tài sản là trên bản gốc của bản sao làm việc của tôi. Khi tôi xem các thuộc tính trên thư mục gốc và nhấp vào Xóa trên svn: mergeinfo, nó hỏi tôi có muốn xóa nó một cách đệ quy không. Điều này đã loại bỏ tất cả các cockups svn: mergeinfo của tôi.


Tôi đã ở trong tình trạng tương tự. Đã làm cho tôi. Cảm ơn!
andrewd18

2

Nếu bạn chắc chắn muốn xóa hàng loạt các thuộc tính mergeinfo, bạn có thể sử dụng tập lệnh BASH sau đây.

FILES=`svn status |grep "^ M      " |sed s/" M      "// |tr '\n', ' '`
svn revert $FILES

Nó nhận được một danh sách các tệp đã thay đổi, chỉ lọc nó để hợp nhất chỉ thay đổi, loại bỏ mọi thứ trừ đường dẫn tệp thực tế, chuyển đổi các đường dẫn một dòng thành một danh sách được phân tách bằng dấu cách và các cuộc gọi trở lại trong danh sách đó.


2
Thanx, nhưng như bạn có thể đã biết từ tôi khi nhắc đến TortoiseSVN Tôi là người dùng Windows và không sử dụng shell Bash :-)
LeonZandman

Điều tương tự cũng có thể xảy ra với DOS, mặc dù có lẽ không phải là ngắn gọn.
Đuổi theo Seibert

1
Không phải điều này chỉ hoàn nguyên các tập tin với mergeinfo đã sửa đổi trên thư mục làm việc hiện tại sao? Nếu vậy, nó không giải quyết được vấn đề: mergeinfo rõ ràng hiện có. Đối với điều đó, bạn cần phải propdel.
Đaminh Scheirlinck

2
Điều này khá lỗi - có một tên tệp có khoảng trắng trong tên của nó? Với các nhân vật toàn cầu trong tên của nó? Tin xấu trong cả hai trường hợp. Cách được phê duyệt / hỗ trợ để phân tích đầu ra từ trạng thái svn là sử dụng --xmlcờ và trình phân tích cú pháp XML; bất cứ điều gì khác có thể thay đổi giữa các phiên bản, vì tính tương thích chuyển tiếp trên định dạng đầu ra văn bản không được đảm bảo.
Charles Duffy

2

Thay vì chỉ mù quáng xóa các thuộc tính mergeinfo, bạn cũng có thể hoàn thành việc hợp nhất "mất tích".

Sao chép thuộc tính mergeinfo từ thư mục gốc, sau đó thực hiện hợp nhất trên thư mục con cho đường dẫn tương đối phù hợp và danh sách sửa đổi chính xác. (Bạn có thể, nhưng không cần, chỉ liệt kê sự khác biệt giữa danh sách này và danh sách đã có trong thư mục con.)

Thông thường việc hợp nhất này sẽ chỉ thay đổi các thuộc tính mergeinfo, không phải bất kỳ tệp thực tế nào. (Nếu cuối cùng thay đổi tệp, thì một trong những hợp nhất trước đó chỉ phải là hợp nhất một phần, điều này có thể đã gây ra sự cố cho bạn.)

Làm điều này sẽ kết thúc việc xóa thuộc tính mergeinfo cho bạn, khi bạn đã nhận được cả hai để khớp chính xác. Bạn cũng có thể cần phải làm ngược lại: hợp nhất vào thư mục gốc bất kỳ sửa đổi hợp nhất nào chỉ có trên thư mục con (một lần nữa, bạn chỉ có thể dán danh sách đầy đủ và để SVN sắp xếp tìm ra sự khác biệt cho bạn).


1

Để thực hiện các thay đổi trong cấu trúc thư mục, điều này sẽ là (không phải là 'chỉ tìm' của DOS):

find . -path "*/.svn" -prune -or -exec svn propdel svn:mergeinfo '{}' \;

Chạy máy khách 1.6.12 được kết nối với máy chủ 1.5, tôi gặp vấn đề tương tự; có một thư mục con trong dự án mà cần svn riêng của mình: mergeinfo, nhưng có 121 mục đó (trong đó có 5 thư mục dưới ./var với "svn: ignore *") có vẻ hơi không phù hợp. Vì vậy, thật tuyệt khi có một tập lệnh (ví dụ Python) có thể xóa thông tin hợp nhất rõ ràng không cần thiết và nói về những khác biệt khác ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.