SVN: Bỏ qua một số thư mục một cách đệ quy


106

Tôi không muốn bất kỳ thư mục nào được đặt tên buildhoặc distđi vào SVN của tôi bất kể nó nằm sâu trong cây như thế nào.

Điều này có khả thi không? Trong git tôi chỉ đặt

build
dist

trong của tôi .gitignoreở gốc và nó đệ quy bỏ qua. Làm cách nào để làm điều này với svn? Xin đừng bảo tôi làm một đạo cụ trên mỗi dir ...


Kiểm tra câu trả lời này để biết giải pháp gốc nếu bạn đang sử dụng Subversion 1.8.
Frank Kusters

Câu trả lời:


57

Kể từ phiên bản phụ 1.8, bây giờ có thuộc svn:global-ignorestính hoạt động giống như svn:ignorenhưng theo cách đệ quy (vì vậy hãy đặt thuộc tính này trên thư mục cấp cao nhất của bạn)


3
Tôi hơi bối rối - có global-ignorestrong ~/.subversion/configtệp, nhưng cũng có thuộc tính kế thừa svn:global-ignores được đặt trên thư mục trong kho SVN, cũng như svn:ignore- bạn có thể cung cấp tóm tắt về các tùy chọn khác nhau này và cách chúng so sánh không? Không như thế nào --recursivecờ ảnh hưởng đến họ quá?
Đài

2
Tôi đã thực hiện nghiên cứu của riêng mình và công bố những phát hiện của tôi trong câu trả lời QA này: stackoverflow.com/a/86052/159145
Đại

[Tôi đã thử nhưng không thành công, objthư mục vẫn hiển thị] ( stackoverflow.com/questions/50960188/… ), bạn có thể giúp tôi xem nó được không?
Luke

Tôi có thể nói "build / *" bỏ qua mọi thứ bên dưới bản dựng trong mọi thư mục bản dựng không?
Johannes Schaub - litb

45

svn propsetmất --recursivenhư một tùy chọn, vì vậy bạn có thể làm được điều này, với hai nhược điểm:

  1. bạn phải kiểm tra toàn bộ kho lưu trữ (hoặc ít nhất là tất cả các thư mục trong đó) và
  2. bạn phải nhớ đặt thuộc svn:ignoretính bất cứ khi nào bạn thêm một thư mục mới

42

Nó là không thể để làm điều này. Chỉ có hai cơ chế bỏ qua trong Subversion, svn:ignore(là cơ chế không đệ quy) và global-ignores(không dành riêng cho kho lưu trữ).


7
svn propset --recursive svn: bỏ qua svn_ignore_rules. trong đó svn_ignore_rules là một tệp chứa các quy tắc bỏ qua - một quy tắc trên mỗi dòng
georg

3
'svn propset --recursive svn: ignore --file svn_ignore_rules.' cho tôi với svn-1.7.6, nếu không bạn đang đệ quy phớt lờ tập tin có tên 'svn_ignore_rules' [sửa: theo 'wytten' trong một chú thích bên dưới]
elbeardmorez

9
Đối với những người bình luận: Như người hỏi đã nói, "Xin đừng bảo tôi làm một đạo cụ trên mỗi dir cha mẹ ...".
Kevin Reid

5
Hiện có thể thực hiện được trong Subversion 1.8
Squirrel

17

Điều này phù hợp với tôi:

 svn propset --recursive svn:ignore *.zip <dir_tree_with_no_zips>

2
Cảm ơn vì điều này, hoạt động tuyệt vời ... Bằng cách duy nhất tôi tìm thấy để bỏ qua cả * .txt và * .pdf là đặt những mẫu đó vào một tệp và sau đó sử dụng tùy chọn 'svn propset --file'
wytten

13

thêm vào tệp ~ / .subversion / config hoặc / etc / subversion / config của bạn:

[miscellany]
global-ignores = build dist

Tôi muốn làm điều đó mỗi repo nếu tôi có thể
Paul Tarjan

1
hmm không chắc liệu có một cách dễ dàng để thực hiện điều đó cho mỗi repo hay không, một hook pre-commit có thể từ chối một số mẫu nhất định, nhưng nó không phải là một giải pháp hoàn chỉnh. svn: bỏ qua trên mỗi hoạt động của dir cha, nhưng không đệ quy. bạn có thể hoán đổi tệp cấu hình của mình bằng một tập lệnh khi làm việc trên các kho lưu trữ khác nhau, nhưng đó là một bước bổ sung.
jspcal

1
Làm những gì xây dựng quận bình?
IgorGanapolsky

9

Có thể bỏ qua các dirs xây dựng và phân bổ bằng cách xóa các thư mục khỏi kiểm soát phiên bản. Mẹo là sử dụng tùy chọn --keep-local để để thư mục trong bản sao đang hoạt động. Ví dụ:

svn rm dist --keep-local
svn ci -m'removed build directory from version control'

Thư mục sẽ không còn được theo dõi bởi subversion nhưng nó sẽ vẫn ở đó trong bản sao làm việc của bạn để giữ đầu ra của trình biên dịch, v.v.

chúc mừng, vui lên


7

Ví dụ cấu trúc thư mục:

Project/
Project/dist/

cd Project
svn propset svn:ignore '*' dist/
svn ci -m "content of dist ignored"

Thật tốt khi thực hiện xóa svn nội dung dist trước lệnh bỏ qua, do đó, các nhánh dist sẽ trống.

Đã làm việc cho tôi, đã được kiểm tra ngày hôm nay. Đây là trang giải thích một chút


6

Để bỏ qua tất cả các tệp như vậy trong tất cả các kho, bạn có thể thêm global-ignorestệp cấu hình cho mỗi người dùng của mình.

Trên các hệ thống giống Unix, khu vực này xuất hiện dưới dạng thư mục có tên .subversion trong thư mục chính của người dùng. Trên hệ thống Win32, Subversion tạo một thư mục có tên Subversion, thường nằm trong vùng Dữ liệu Ứng dụng của thư mục hồ sơ của người dùng

Xem Tùy chọn cấu hình

Thật không may, không có tùy chọn cho mỗi kho lưu trữ để làm điều này. Về cơ bản, nó cho mỗi người dùng, hoặc mỗi thư mục, vì vậy nhiều svn:ignorescó thể là cách để đi, gây khó chịu hết mức có thể.


1
Tôi muốn làm điều đó mỗi repo nếu tôi có thể
Paul Tarjan

Ồ, vậy thì bạn đã gặp may rồi. Như @Kevin Reid nói - bạn có trên mỗi thư mục hoặc mỗi người dùng.
Blair Conrad

6

Trước tiên, bạn phải di chuyển đến thư mục trên cùng của bản sao làm việc của mình và tạo một tệp ở đó (giả sử .svnignore), nơi bạn sẽ đặt tất cả các mẫu mà bạn muốn bị bỏ qua, chẳng hạn (đối với dự án Android):

bin
gen
proguard
.classpath
.project
local.properties
Thumbs.db
*.apk
*.ap_
*.class
*.dex

Sau đó, bạn chạy lệnh sau (hãy nhớ rằng bạn phải ở thư mục trên cùng của bản sao làm việc của mình):

svn propset svn:ignore -R -F .svnignore .

Điều này sẽ chỉ hoạt động đối với các thư mục và tệp chưa được kiểm soát phiên bản. Nếu bạn muốn một thư mục (hoặc tệp) đang được tạo phiên bản cũng bắt đầu bị bỏ qua, hãy xóa nó khỏi kiểm soát phiên bản bằng cách chạy lệnh:

svn rm --keep-local <path>

Có tất cả những điều này từ bài viết tuyệt vời này giải thích tất cả: http://superchlorine.com/2013/08/getting-svn-to-ignore-files-and-directories/


Điều này vô cùng hữu ích. Đây là cách tốt nhất mà tôi đã tìm thấy để có được hành vi bỏ qua giống git trong svn. Cảm ơn rất nhiều.
Jonathan Wilson

6

Trong subversion 1.8 qua, có thể đặt toàn cục bỏ qua cho kho lưu trữ hiện tại.

svn propset svn:global-ignores build .
svn propset svn:global-ignores dist .

Ngoài ra, bạn có thể tạo một thư mục có tên .svnignore và ghi các điều kiện.

build
dist

hãy nhớ một điều kiện trên mỗi dòng, việc thiết lập build / * hoặc dist / debug là vô ích. Sau đó thực hiện lệnh:

svn propset svn:global-ignores -F .svnignore .

hoạt động hoàn hảo! chỉ cần chạy lệnh đầu tiên trên repo mới được kiểm tra.
gaurav

3

Tạo một tệp và thêm nội dung bỏ qua của bạn vào đó

danh sách nhập vào:

file1 
directory1
file2
etc...

sau đó áp dụng lệnh sau

for n in directory; do svn propset svn:ignore -F ignore-list $n; done

thư mục là tên thư mục của bạn, bạn có thể phân loại phụ cũng như thư mục / thư mục con. Hoặc sử dụng * để ghi chú thư mục hiện tại của bạn.

Điều này giả sử bạn đang sử dụng bash làm trình bao


Là gì $ n ở đây?
IgorGanapolsky

1
@igor Ganapolsky - $ n là biến của vòng lặp for. Nó sẽ được đặt làm chỉ mục cho chuỗi mà bạn đang lặp lại; trong trường hợp này là thư mục được chỉ định bởi "thư mục" trong ví dụ trên.
jncc99

3
svn propset --recursive svn:ignore svn_ignore_rules .

trong đó svn_ignore_rules là một tệp chứa các quy tắc bỏ qua - một quy tắc trên mỗi dòng

Tất nhiên bạn phải chạy lại nó mỗi khi bạn thêm thư mục mới vào repo của mình

svn_ignore_rules cũng có thể được coi là đã được kiểm tra vào repo, để người dùng khác có quyền ghi vào repo có thể sử dụng lại


2
cd parent_dir # thư mục chứa thư mục được bỏ qua một cách đệ quy
svn propedit svn: bỏ qua. # sẽ mở svn-prop.tmp
tranh thủ (các) thư mục
^ X
Y
cam kết -m 'bỏ qua chỉ thị được nhắm mục tiêu'

giúp tôi, tôi đã có vấn đề với mô hình thư mục cài đặt, SVN được complianing thư mục đó không trong repo, set EDITOR=notepad, svn propedit svn:ignore .làm việc tốt ...
Betlista

1

Vì dường như không có giải pháp cho vấn đề có lẽ phổ biến này, tôi muốn chia sẻ giải pháp của chúng tôi. Như những người khác đã nói rõ, bạn có thể sử dụng thuộc svn:ignoretính, điều này áp dụng cho một thư mục (và do đó không áp dụng cho các thư mục mới) hoặc bạn sử dụng global-ignoresáp dụng cho một người dùng (nhưng không thuộc về kho lưu trữ).

Để làm cho cuộc sống dễ dàng hơn một chút, tôi đã tạo một tệp reg có tên Settings.Svn.regvà thêm nó vào thư mục gốc của kho lưu trữ. Bây giờ mọi người có thể nhấp đúp vào regfile này một lần và đã hoàn tất các cài đặt.

REGEDIT4

[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\miscellany]
"global-ignores"="obj *.suo *.bak *.pdb *.user *.Cache*"

Tôi thực sự đánh giá cao một giải pháp trong kho lưu trữ SVN, vì vậy nếu ai đó biết, bạn có muốn chia sẻ nó không?


0

Một cách sẽ là thêm một số loại kiểm tra vào hook trước hoặc sau khi cam kết nhưng cần lưu ý ngay nếu bạn không sở hữu máy chủ repo.

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.