2009-08-02 39 views
49

Đôi khi tôi đưa nhiều tệp vào các thư mục khác nhau trong dự án của mình. Bây giờ tôi đang thêm tất cả các tập tin một cho dự án của tôi trước khi cam kết. Có bất kỳ lệnh thiết bị đầu cuối Linux nào có thể thêm tất cả các tệp không phiên bản vào Subversion không?Thêm tất cả các tệp chưa được phiên bản vào Subversion bằng một lệnh Linux

Và điều gì sẽ xảy ra nếu tôi muốn thêm tất cả các tệp ngoại trừ một hoặc hai tệp?

+0

có thể trùng lặp với [Cách sử dụng "svn add" đệ quy trong Bảng điều khiển Windows?] (http://stackoverflow.com/questions/4302888/how-to-use-svn-add-recursively-in-windows-console) – Saul

Trả lời

9

Theo mặc định, lệnh svn add là đệ quy. Chỉ cần trỏ nó vào thư mục cấp cao nhất của dự án của bạn và nó sẽ thêm bất kỳ tập tin nào chưa có.

Bạn có thể muốn bao gồm tùy chọn --force, mặc dù hãy nhớ rằng điều này cũng sẽ thêm các tệp bị loại trừ do svn: ignore (nếu bạn không sử dụng svn: ignore, thì bạn sẽ không có bất kỳ vấn đề).

26

Thêm bất kỳ tập tin với một dấu chấm hỏi bên cạnh nó, trong khi vẫn không bao gồm các file bị bỏ qua:

svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2}' | xargs svn add 
svn commit 

http://codesnippets.joyent.com/posts/show/45

+0

Xin chào James. Xin lỗi tôi đã bình chọn câu trả lời của bạn, nhưng đó là một sai lầm. Hãy chỉnh sửa nó, vì vậy tôi có thể rollback downvote này (và bình luận này là tốt). – Guillaume

+0

Tôi không chắc tại sao, nhưng tôi tin tưởng regex của bạn không quan tâm đến tên tập tin có chứa không gian ... – genuinefafa

-1

tôi đã không sử dụng SVN. Nhưng sau đây nên làm việc.

svn add foo/bar.file bar/foo.file 

này nên thêm tập tin trong thư mục bar.filefoofoo.file hiện trong thư mục bar.

svn add foo nên thêm tất cả các tệp trong foo vào máy chủ. Cờ "đệ quy" được đặt theo mặc định.

Và để thêm tất cả các tệp vào một thư mục ngoại trừ một vài tệp (như các tệp bắt đầu/kết thúc bằng từ khóa tmp, test, v.v.), tôi không nghĩ có cách dọn dẹp/đơn giản hơn viết kịch bản shell tốt hơn để thực hiện điều này.

+4

Tại sao bạn sẽ cố gắng và đóng góp với một cái gì đó mà bạn đã không sử dụng hoặc cho rằng vấn đề không thể chắc chắn nó hoạt động? –

+0

Tôi phải đồng ý với nhận xét ở trên. Google bị che khuất bởi "Tôi chưa bao giờ sử dụng X trước đây nhưng ..." Nó phải dừng lại. – steve

76
svn add --force <directory> 

Thêm đã được đệ quy. Bạn chỉ cần ép buộc nó đi qua các thư mục con được phiên bản.

10

Lệnh này sẽ thêm bất kỳ tệp không được phiên bản nào được liệt kê trong svn st đầu ra lệnh để lật đổ.

Lưu ý rằng mọi tên tệp có khoảng trống trong đầu ra svn stat sẽ không được thêm vào. Hơn nữa, hành vi kỳ quặc có thể xảy ra nếu bất kỳ tên tập tin nào chứa '?'.

svn st | grep ? | tr -s ' ' | cut -d ' ' -f 2 | xargs svn add 

hoặc nếu bạn là tốt tại awk:

svn st | grep ? | awk '{print $2}' | xargs svn add 

Giải thích:

Bước 1:svn st lệnh

[[email protected] rails]$svn st 
?  app/controllers/application.rb 
M  app/views/layouts/application.html.erb 
?  config/database.yml 

Bước 2: Chúng tôi grep file un-phiên bản với grep lệnh:

[[email protected] rails]$svn st | grep ? 
?  app/controllers/application.rb 
?  config/database.yml 

Bước 3: Sau đó, loại bỏ sức ép không gian giữa ? và đường dẫn tập tin bằng cách sử dụng lệnh tr:

[[email protected] rails]$svn st | grep ? | tr -s ' ' 
? app/controllers/application.rb 
? config/database.yml 
</pre> 

Bước 4: Sau đó chọn cột thứ hai từ đầu ra bằng cách sử dụng lệnh cắt:

[[email protected] rails]$svn st | grep ? | tr -s ' ' | cut -d ' ' -f 2 
app/controllers/application.rb 
config/database.yml 

Bước 5: Cuối cùng, đi qua các đường dẫn tập tin như là đầu vào tiêu chuẩn để svn add lệnh:

[[email protected] rails]$svn st | grep ? | tr -s ' ' | cut -d ' ' -f 2 | xargs svn add 
A  app/controllers/application.rb 
A  config/database.yml 
+0

kudo cho lời giải thích! –

0

Phiên bản này của các lệnh trên sẽ chăm sóc của các trường hợp các tập tin cam kết hoặc các đường dẫn đến chúng chứa khoảng trắng . Lệnh này sẽ vẫn không thành công, nếu đường dẫn chứa một dấu nháy đơn.

svn st |grep ^?| cut -c9-| awk '{print "\x27"$0"\x27"}' | xargs svn add 

tôi đã đi cho việc cắt giảm -c9- để thoát khỏi không gian hàng đầu và giả định rằng lệnh svn st sẽ bắt đầu filename tại 9 nhân vật trên tất cả các máy. Nếu bạn không chắc chắn, hãy kiểm tra phần này của lệnh trước.

0

Tập lệnh shell này, kiểm tra đệ quy (svn status) thư mục trong dự án của bạn, xóa các tệp bị thiếu thêm tệp mới vào kho lưu trữ. Đó là một số loại "lưu trữ vào kho lưu trữ ảnh chụp nhanh hiện tại của dự án".

if [ $# != 1 ] 
then 
    echo "usage: doSVNsnapshot.sh DIR" 
    exit 0 
fi 

ROOT=$1 

for i in `find ${ROOT} -type d \! -path "*.svn*" ` 
do 

    echo 
    echo "--------------------------" 
    (cd $i ; 
    echo $i 
    echo "--------------------------" 


    svn status | awk ' 
      /^[!]/ { system("svn rm " $2) } 
      /^[?]/ { system("svn add " $2) } 
     ' 
    ) 
    echo 

done 
1

Giải pháp được đề cập ở trên với awk '{print $2}' không may là hoạt động nếu các tệp có khoảng trắng. Trong trường hợp này, điều này hoạt động tốt:

svn st | grep "^?" | sed 's/^?[ \t]*//g' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn add 

nơi

sed 's/^?[ \t]*//g' 

loại bỏ các dấu hỏi và ký tự trống ngay từ đầu và

sed 's/^/"/g' | sed 's/$/"/g' 

bao quanh tên tập tin với dấu ngoặc kép.

1

Một cách tiếp cận sử dụng một Perlone-liner để thêm tất cả các file hiển thị với một dấu hỏi bởi "svn st" sẽ là:

svn st | perl -ne 'print "$1\n" if /^\?\s+(.*)/' | xargs svn add 

này cũng nên làm việc với các nhân vật không gian trong tên tập tin.

21

này sẽ cố gắng để thêm tất cả các file - nhưng chỉ thực sự thêm những người mà chưa có trong SVN:

svn add --force ./* 
1

Không ai trong số các bạn là hoàn toàn đúng Tôi dành cả đêm để sửa chữa nó và nó chạy đúng trong Jenkins của tôi:

svn status | grep -v "^.[ \t]*\..*" | grep "^?[ \t]*..*" | awk '{print $2}' | sed 's/\\/\//g' | sed 's/\(.*\)\r/"\1"/g' | xargs svn add --parents 
svn commit 
  1. tình trạng
  2. loại bỏ svn
  3. tìm thấy? tại dòng bắt đầu để xác định xem nó là không phiên bản (sửa đổi nó thành | grep "^? [\ t] *. * cpp" | sẽ chỉ thêm cpp)
  4. xoá? (Một trong những chủ đề memtion trên vấn đề của awk, bạn có thể thử để tr sử dụng hoặc sed thay)
  5. thay thế giật gân để splash linux (không bắt buộc, Cygwin cần) dòng
  6. kèm với trích dẫn nội
  7. gọi xargs (bạn nên thêm - để đảm bảo các thư mục con cấp trung cũng được thêm nếu bạn cố gắng lọc cpp hoặc mẫu tệp nhất định)
Các vấn đề liên quan