Làm cách nào để bỏ qua các tệp trong Subversion?


645

Làm cách nào để bỏ qua các tệp trong Subversion?

Ngoài ra, làm cách nào để tìm các tệp không thuộc kiểm soát phiên bản?


Thật thú vị khi thấy mỗi câu hỏi đơn giản (có thể từ một người dùng git) có nghĩa là nhiều câu trả lời quá phức tạp. Nếu điều này xảy ra, đó là Subversion em bé.
Valerio Bozz

Câu trả lời:


738

(Câu trả lời này đã được cập nhật để phù hợp với hành vi của SVN 1.8 và 1.9)

Bạn có 2 câu hỏi:

Đánh dấu các tập tin là bỏ qua:

Bởi "tệp bị bỏ qua" Tôi có nghĩa là tệp sẽ không xuất hiện trong danh sách ngay cả khi "không đảo ngược": ứng dụng khách SVN của bạn sẽ giả vờ rằng tệp không tồn tại trong hệ thống tệp.

Các tập tin bị bỏ qua được chỉ định bởi một "mẫu tập tin". Cú pháp và định dạng của các mẫu tệp được giải thích trong tài liệu trực tuyến của SVN: http://svnbook.red-bean.com/nightly/en/svn.advified.props.special.ignore.html "Các mẫu tệp trong Subversion".

Subversion, kể từ phiên bản 1.8 (tháng 6 năm 2013) trở lên, hỗ trợ 3 cách khác nhau để chỉ định các mẫu tệp. Dưới đây là một bản tóm tắt với các ví dụ:

1 - Khu vực cấu hình thời gian chạy - global-ignorestùy chọn:

  • Đây là cài đặt chỉ dành cho khách hàng , vì vậy global-ignoresdanh sách của bạn sẽ không được chia sẻ bởi những người dùng khác và nó áp dụng cho tất cả các repos bạn thanh toán trên máy tính của bạn.
  • Cài đặt này được xác định trong tệp Khu vực cấu hình thời gian chạy của bạn:
    • Windows (dựa trên tệp) - C:\Users\{you}\AppData\Roaming\Subversion\config
    • Windows (dựa trên đăng ký) - Software\Tigris.org\Subversion\Config\Miscellany\global-ignorestrong cả hai HKLMHKCU.
    • Linux / Unix - ~/.subversion/config

2 - svn:ignoreThuộc tính, được đặt trên thư mục (không phải tệp):

  • Điều này được lưu trữ trong repo, vì vậy những người dùng khác sẽ có cùng các tệp bỏ qua. Tương tự như cách làm .gitignoreviệc.
  • svn:ignoređược áp dụng cho các thư mục và không đệ quy hoặc kế thừa. Bất kỳ tệp hoặc thư mục con ngay lập tức của thư mục mẹ phù hợp với Mẫu tệp sẽ bị loại trừ.
  • Trong khi SVN 1.8 bổ sung khái niệm "thuộc tính được thừa kế", svn:ignorebản thân thuộc tính bị bỏ qua trong các thư mục con cháu không ngay lập tức:

    cd ~/myRepoRoot                             # Open an existing repo.
    echo "foo" > "ignoreThis.txt"                # Create a file called "ignoreThis.txt".
    
    svn status                                  # Check to see if the file is ignored or not.
    > ?    ./ignoreThis.txt
    > 1 unversioned file                        # ...it is NOT currently ignored.
    
    svn propset svn:ignore "ignoreThis.txt" .   # Apply the svn:ignore property to the "myRepoRoot" directory.
    svn status
    > 0 unversioned files                       # ...but now the file is ignored!
    
    cd subdirectory                             # now open a subdirectory.
    echo "foo" > "ignoreThis.txt"                # create another file named "ignoreThis.txt".
    
    svn status
    > ?    ./subdirectory/ignoreThis.txt        # ...and is is NOT ignored!
    > 1 unversioned file
    

    (Vì vậy, tệp ./subdirectory/ignoreThiskhông bị bỏ qua, mặc dù " ignoreThis.txt" được áp dụng trên .root repo).

  • Do đó, để áp dụng một danh sách bỏ qua đệ quy bạn phải sử dụng svn propset svn:ignore <filePattern> . --recursive.

    • Điều này sẽ tạo ra một bản sao của tài sản trên mỗi thư mục con.
    • Nếu <filePattern>giá trị này khác nhau trong một thư mục con thì giá trị của con sẽ hoàn toàn ghi đè lên cha mẹ, do đó không có hiệu ứng "phụ gia".
    • Vì vậy, nếu bạn thay đổi <filePattern>gốc ., thì bạn phải thay đổi nó --recursiveđể ghi đè lên thư mục con và con cháu.
  • Tôi lưu ý rằng cú pháp dòng lệnh là phản trực giác.

    • Tôi đã bắt đầu giả định rằng bạn sẽ bỏ qua một tệp trong SVN bằng cách nhập một cái gì đó giống như svn ignore pathToFileToIgnore.txttuy nhiên đây không phải là cách tính năng bỏ qua của SVN hoạt động.

3- Tài svn:global-ignoressản. Yêu cầu SVN 1.8 (tháng 6 năm 2013):

  • Điều này tương tự svn:ignore, ngoại trừ việc nó sử dụng tính năng "thuộc tính được thừa kế" của SVN 1.8.
  • So sánh với svn:ignore, mẫu tệp được tự động áp dụng trong mọi thư mục con cháu (không chỉ con ngay lập tức).
    • Điều này có nghĩa là không cần thiết để thiết lập svn:global-ignoresvới --recursivecờ, như thừa hưởng bỏ qua mô hình tập tin sẽ được tự động áp dụng như họ đang thừa hưởng.
  • Chạy cùng một bộ lệnh như trong ví dụ trước, nhưng sử dụng svn:global-ignoresthay thế:

    cd ~/myRepoRoot                                    # Open an existing repo
    echo "foo" > "ignoreThis.txt"                       # Create a file called "ignoreThis.txt"
    svn status                                         # Check to see if the file is ignored or not
    > ?    ./ignoreThis.txt
    > 1 unversioned file                               # ...it is NOT currently ignored
    
    svn propset svn:global-ignores "ignoreThis.txt" .
    svn status
    > 0 unversioned files                              # ...but now the file is ignored!
    
    cd subdirectory                                    # now open a subdirectory
    echo "foo" > "ignoreThis.txt"                       # create another file named "ignoreThis.txt"
    svn status
    > 0 unversioned files                              # the file is ignored here too!
    

Đối với người dùng TortoiseSVN:

Toàn bộ sự sắp xếp này gây khó hiểu cho tôi, vì thuật ngữ của TortoiseSVN (như được sử dụng trong hệ thống menu Windows Explorer của họ) ban đầu gây hiểu lầm cho tôi - Tôi không chắc ý nghĩa của trình đơn Bỏ qua "Thêm đệ quy", "Thêm *" và "Thêm" tùy chọn. Tôi hy vọng bài đăng này giải thích cách tính năng Bỏ qua liên kết với tính năng SVN Properties. Điều đó nói rằng, tôi khuyên bạn nên sử dụng dòng lệnh để đặt các tệp bị bỏ qua để bạn cảm nhận về cách thức hoạt động của nó thay vì sử dụng GUI và chỉ sử dụng GUI để thao tác các thuộc tính sau khi bạn cảm thấy thoải mái với dòng lệnh.

Liệt kê các tệp bị bỏ qua:

Lệnh svn statussẽ ẩn các tệp bị bỏ qua (nghĩa là các tệp khớp với global-ignoresmẫu RGA hoặc khớp với svn:ignoremẫu của thư mục mẹ ngay lập tức hoặc khớp với bất kỳ mẫu nào của thư mục ancesor svn:global-ignores.

Sử dụng --no-ignoretùy chọn để xem những tập tin được liệt kê. Các tệp bị bỏ qua có trạng thái I, sau đó chuyển đầu ra grepthành chỉ hiển thị các dòng bắt đầu bằng "I".

Lệnh là:

svn status --no-ignore | grep "^I"

Ví dụ:

svn status
> ? foo                             # An unversioned file
> M modifiedFile.txt                # A versioned file that has been modified

svn status --no-ignore
> ? foo                             # An unversioned file
> I ignoreThis.txt                  # A file matching an svn:ignore pattern
> M modifiedFile.txt                # A versioned file that has been modified

svn status --no-ignore | grep "^I"
> I ignoreThis.txt                  # A file matching an svn:ignore pattern

ta-da!


6
Để tìm các tệp bị bỏ qua: trạng thái svn -u -v --no-ign | grep "^ I" | awk "{print \ $ 2}"
Christian Madsen

3
nếu bạn muốn bỏ qua tập tin ./FolderA/FolderB/FileToIgnore, hãy làm điều này từ của bạn. thư mục: svn propset svn: bỏ qua "FileToIgnore" Thư mụcA / Thư mụcB /
jnj

8
nếu bạn đang sử dụng svn propedit svn:ignore .và không có trình soạn thảo văn bản nào được định cấu hình, bạn sẽ nhận được thông báo lỗi cho biết svn: E205007: Không có biến môi trường nào SVN_EDITOR, VISUAL hoặc EDITOR được đặt và không có tùy chọn cấu hình thời gian chạy 'Editor-cmd' tìm thấy thay vì mở một trình soạn thảo. Vì vậy, chỉ cần xác định --editor-cmd nano như thế nàysvn propedit svn:ignore . --editor-cmd nano
Jonathan Morales Vélez

12
Bạn cũng có thể bỏ qua các tệp có tên tệp cụ thể trong tất cả các thư mục con bằng cách sử dụng đối số "--recursive". tức là svn propset svn: bỏ qua "* .jpg". --recursive
Templar

2
Một thay thế đơn giản hơn cho awk là grep:svn status | grep '^?'
Johnride

91

Sử dụng lệnh sau để tạo danh sách không thuộc tệp kiểm soát phiên bản.

svn status | grep "^\?" | awk "{print \$2}" > ignoring.txt

Sau đó chỉnh sửa tệp để chỉ các tệp bạn thực sự muốn bỏ qua . Sau đó sử dụng cái này để bỏ qua các tệp được liệt kê trong tệp:

svn propset svn:ignore -F ignoring.txt .

Lưu ý dấu chấm ở cuối dòng. Nó nói với SVN rằng thuộc tính đang được đặt trên thư mục hiện tại.

Xóa tệp:

rm ignoring.txt

Cuối cùng cam kết,

svn ci --message "ignoring some files"

Sau đó, bạn có thể kiểm tra tệp nào bị bỏ qua thông qua:

svn proplist -v

2
Đẹp. Một cải tiến nhỏ là svn status | awk "/^?/ {print \$2}" > ignoring.txt.
Dirk Eddelbuettel

4
Tại sao xóa tập tin? giữ nó trong repo nếu bạn cần tạo lại / thêm / xóa
tgkprog 14/03/2015

Lưu ý giải pháp này sẽ không bỏ qua các tệp trong thư mục con (ngay cả khi chúng hiển thị trong ignecting.txt).
shaneb

Điều đó sẽ giữ cho bỏ qua hiện có? Nếu không, làm thế nào để thực hiện nó trong một lệnh (tức là - không bỏ qua và giữ các dòng đứng trước I)?
a1an

Điều này sẽ ghi đè bỏ qua hiện tại của bạn, hãy thử: svn pg svn:ignore . >> ignore.txtsau lệnh đầu tiên để thêm các bỏ qua hiện tại vào tệp.
ulitosCoder

55

.gitignore như cách tiếp cận

Bạn có thể bỏ qua một tập tin hoặc thư mục như .gitignore. Chỉ cần tạo một tệp văn bản của danh sách các thư mục / tệp bạn muốn bỏ qua và chạy mã dưới đây:

svn propset svn:ignore -F ignorelist.txt .

HOẶC nếu bạn không muốn sử dụng tệp văn bản, bạn có thể làm như thế này:

svn propset svn:ignore "first
 second
 third" .

Nguồn: Blog của Karsten - Đặt svn: bỏ qua cho nhiều tệp từ dòng lệnh


1
Lưu ý rằng nếu sau này bạn sửa đổi tệp bỏ qua của mình, bạn cần phải chạy lại svn:ignorelệnh (xem stackoverflow.com/a/58380306/189518 )
Sensei James

50

Nếu bạn đang sử dụng TortoiseSVN , nhấp chuột phải vào một tệp và sau đó chọn TortoiseSVN / Thêm vào danh sách bỏ qua . Điều này sẽ thêm tập tin / ký tự đại diện vào svn:ignoretài sản.

svn:ignoresẽ được kiểm tra khi bạn đang kiểm tra các tệp và các tệp phù hợp sẽ bị bỏ qua. Tôi có danh sách bỏ qua sau đây cho một dự án Visual Studio .NET:

bin obj
*.exe
*.dll
_ReSharper
*.pdb
*.suo

Bạn có thể tìm thấy danh sách này trong menu ngữ cảnh tại TortoiseSVN / Properties .


26

Vì dường như không ai nhắc đến nó ...

svn propedit svn:ignore .

Sau đó chỉnh sửa nội dung của tệp để chỉ định các mẫu cần bỏ qua, thoát khỏi trình chỉnh sửa và bạn đã hoàn tất.


3
Câu trả lời này rất hữu ích. Trong trường hợp của tôi, tôi cần phải thay đổi "." đến thư mục con của tệp tôi muốn bỏ qua và chỉ định mẫu tệp. Ngoài ra, lần đầu tiên, tôi cần chạy cái này (Tôi trên Mac): export SVN_EDITOR = "nano"
Elijah Lofgren

22

Tôi tìm thấy bài viết .svnignore Ví dụ cho Java .

Ví dụ: .svnignore cho Ruby on Rails,

/log

/public/*.JPEG
/public/*.jpeg
/public/*.png
/public/*.gif

*.*~

Và sau đó:

svn propset svn:ignore -F .svnignore .

Ví dụ cho .gitignore. Bạn có thể sử dụng cho .svnignore của bạn

https://github.com/github/gitignore


1
tôi đã làm như bạn đã nói ... nhưng khi tôi chạy trạng thái svn. nó vẫn hiển thị các tập tin bị bỏ qua với "?"
Harshit Gupta

Tôi chưa bao giờ kiểm tra trạng thái svn, nhưng với svn add * và sau đó svn cam kết, bỏ qua các tệp không phải là cam kết.
d.danailov

nếu một tệp "a.txt" đã có trong kiểm soát phiên bản, thì việc bỏ qua được thực hiện bằng lệnh như "svn propset svn: ign -F .svnignore a.txt"? nó có đúng không ?
errakeshpd

Nếu bạn thêm "a.txt" trong tệp .svnignore của mình, tôi không chắc, nhưng lệnh phải đúng.
d.danailov

10

Khi sử dụng propedit, đảm bảo không có bất kỳ dấu cách nào vì điều đó sẽ khiến tệp bị loại khỏi danh sách bỏ qua.

Chúng được chèn tự động nếu bạn sử dụng tab-autocomplete trên linux để tạo tệp để bắt đầu:

svn propset svn:ignore 'file1
file2' .

6
Điều này chỉ hoạt động đối với một số shell, chẳng hạn như bash. Lưu ý rằng việc phát hành lại đạo cụ sẽ ghi đè lên các mẫu trước đó.
JA Faucett

Vì vậy, file1file2 phải nằm trên các dòng riêng biệt?
IgorGanapolsky

8

Một giải pháp khác là:

svn st | awk '/^?/{print $2}' > svnignore.txt && svn propget svn:ignore >> svnignore.txt && svn propset svn:ignore -F svnignore.txt . && rm svnignore.txt

hoặc từng dòng

svn st | awk '/^?/{print $2}' > svnignore.txt 
svn propget svn:ignore >> svnignore.txt 
svn propset svn:ignore -F svnignore.txt . 
rm svnignore.txt

Những gì nó làm:

  1. Nhận các tệp trạng thái từ svn
  2. Lưu tất cả các tập tin với ? vào tệp "svnignore.txt"
  3. Nhận các tệp đã bị bỏ qua và thêm chúng vào tệp "svnignore.txt"
  4. Yêu cầu svn bỏ qua các tệp trong "svnignore.txt"
  5. Xóa tệp

8

Ngoài ra, nếu bạn sử dụng Rùa SVN, bạn có thể làm điều này:

  1. Trong menu ngữ cảnh, chọn "TortoiseSVN", sau đó "Thuộc tính"
  2. Trong cửa sổ xuất hiện, nhấp vào "Mới", sau đó "Nâng cao"
  3. Trong cửa sổ xuất hiện đối diện với "Tên thuộc tính" chọn hoặc nhập "svn: bỏ qua", ngược lại với "Giá trị thuộc tính" loại tên tệp hoặc tên thư mục mong muốn (trong trường hợp của tôi là "* / target"), nhấp vào "Áp dụng tài sản đệ quy "
  4. Đồng ý. Đồng ý.
  5. Cam kết

6
  1. cd ~ /. chuyển đổi
  2. mở cấu hình
  3. tìm dòng như 'bỏ qua toàn cầu'
  4. đặt bỏ qua loại tệp như thế này: global-ignores = * .o * .lo * .la * .al .libs * .so .so. [0-9] * .pyc * .pyo 88 * .rej ~ # #. # *. *. swp .DS_Store đầu ra node_modules

Cảm ơn bạn, câu trả lời của bạn là người duy nhất đề cập đến các configtập tin.
Henrique de Sousa

Câu trả lời này cũng đề cập đến nó @HenriquedeSousa stackoverflow.com/a/86052/7724 và cũng giải thích rằng đó là cách bỏ qua các tệp chỉ dành cho khách hàng cục bộ.
bzlm

5

Một phiên bản dễ đọc hơn của câu trả lời của bkbilly:

svn st | awk '/^?/{print $2}' > svnignore.txt
svn propget svn:ignore >> svnignore.txt
svn propset svn:ignore -F svnignore.txt .
rm svnignore.txt

Những gì nó làm:

  1. Nhận các tệp trạng thái từ svn
  2. Lưu tất cả các tập tin với ? vào tệp "svnignore.txt"
  3. Nhận các tệp đã bị bỏ qua và thêm chúng vào tệp "svnignore.txt"
  4. Yêu cầu svn bỏ qua các tệp trong "svnignore.txt"
  5. Xóa tệp

Tôi thích câu trả lời của bkbilly, nhưng phiên bản này phá vỡ từng dòng để dễ đọc hơn và xóa && mà trong các thử nghiệm của tôi không làm gì cả, vì dòng đầu tiên luôn tạo tệp tạm thời và cùng một tệp tạm thời này luôn nằm trong danh sách bỏ qua.
LivingDust

Một đề xuất chỉnh sửa sẽ có phù hợp hơn trong trường hợp này. Đánh giá cao những nỗ lực!
Jim

Tôi chưa có đủ danh tiếng để đề nghị chỉnh sửa. nhưng tôi không muốn phá hỏng một giao thức tốt. Có một README đơn giản về các hướng dẫn khi nào nên đề xuất và chỉnh sửa tốt hơn là đăng một câu trả lời mới, v.v.?
LivingDust

1
Nếu câu trả lời của bạn giống hệt như câu trả lời được đăng cách đây một năm rưỡi, thì nó khá dễ dàng. Bạn thậm chí đã sao chép lời giải thích " Những gì nó làm ".
Jim

3

Bạn cũng có thể đặt mẫu bỏ qua toàn cục trong tệp cấu hình của SVN.


1
Bạn có thể thiết lập một mẫu bỏ qua cho một kho lưu trữ cụ thể?
David Doria

3

svn status sẽ cho bạn biết những tập tin nào không có trong SVN, cũng như những gì đã thay đổi.

Nhìn vào các thuộc tính SVN cho thuộc tính bỏ qua.

Đối với tất cả mọi thứ SVN, Sách đỏ được yêu cầu đọc.



2

Sử dụng lệnh svn status trên bản sao làm việc của bạn để hiển thị trạng thái của các tệp, các tệp chưa được kiểm soát phiên bản (và không bị bỏ qua) sẽ có dấu chấm hỏi bên cạnh chúng.

Đối với việc bỏ qua các tệp bạn cần chỉnh sửa svn: bỏ qua thuộc tính, hãy đọc chương Bỏ qua các mục không đảo ngược trong svnbook tại http://svnbook.red-bean.com/en/1.5/svn.advified.props.special.ignore. html . Cuốn sách cũng mô tả thêm về việc sử dụng trạng thái svn.


2

SVN ignoredễ quản lý trong TortoiseSVN. Mở TortoiseSVN và nhấp chuột phải vào menu tệp, sau đó chọn Thêm vào danh sách bỏ qua.

Điều này sẽ thêm các tập tin trong svn:ignoretài sản. Khi chúng tôi kiểm tra trong các tệp thì những tệp được khớp với svn:ignoređó sẽ bị bỏ qua và sẽ không cam kết.

Trong dự án Visual Studio, chúng tôi đã thêm các tệp sau để bỏ qua:

bin obj
*.exe
*.dll
*.pdb
*.suo

Chúng tôi đang quản lý mã nguồn trên SVN của Comparetrap sử dụng phương pháp này thành công


2

Điều gì làm việc cho tôi:

Làm cách nào để bỏ qua các tệp trong Subversion?
1.Trong File Explorer, nhấp chuột phải vào tên thư mục dự án SVN 2. Nhấp vào cửa sổ
"SVN Commit ..."
3.A "commit" sẽ xuất hiện 4.
Nhấp chuột phải vào thư mục / tệp mà bạn muốn bỏ qua 5. Nhấp
vào Thêm để bỏ qua danh sách 6. Chọn
thư mục / tệp
7. Tham khảo "thay đổi thuộc tính" thành SVN

Ngoài ra, làm cách nào để tìm các tệp không thuộc kiểm soát phiên bản?
Sau Bước 3 ở trên, nhấp vào "Hiển thị tệp không đảo ngược"


0
  1. mở bạn sử dụng Sản phẩm JetBrains (ví dụ Pycharm)
  2. sau đó nhấp vào nút 'cam kết' trên thanh công cụ trên cùng hoặc sử dụng phím tắt 'ctrl + k' ảnh chụp màn hình
  3. trên giao diện cam kết, di chuyển các tệp không mong muốn của bạn sang một danh sách thay đổi khác như sau. ảnh chụp màn hình_commit_change
  4. lần sau bạn chỉ có thể cam kết danh sách thay đổi mặc định.
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.