Làm cách nào để tôi thêm svn 'tất cả các tệp không được đảo ngược vào SVN?


177

Tôi đang tìm kiếm một cách tốt để tự động 'svn thêm' tất cả các tệp không được đảo ngược trong một bản sao làm việc vào kho SVN của tôi.

Tôi có một máy chủ trực tiếp có thể tạo một vài tệp cần được kiểm soát nguồn. Tôi muốn có một đoạn script ngắn mà tôi có thể chạy để tự động thêm chúng, thay vì đi qua và thêm chúng một lần.

Máy chủ của tôi đang chạy Windows Server 2003 vì vậy một giải pháp Unix sẽ không hoạt động.


1
@Saul Câu hỏi này rõ ràng trước câu hỏi mà bạn đã liên kết vì vậy tôi không thấy nó có thể là một bản sao như thế nào. Nếu bất cứ điều gì câu hỏi khác là trùng lặp.
Neutrino

Cygwin là một lựa chọn. Cung cấp cho bạn sức mạnh của bash trên bất kỳ môi trường windows. Đã là người dùng trong hơn 10 năm với các vấn đề rất nhỏ.
dùng151841

Câu trả lời:


346

svn add --force * --auto-props --parents --depth infinity -q

Mẹo tuyệt vời! Một nhận xét: Eclipse của tôi tự động thêm các tệp mới vào danh sách bỏ qua. Nó có thể là một vấn đề về cấu hình, nhưng dù sao đi nữa: có --no-ignoretùy chọn giúp.

Sau này, bạn có thể cam kết:

svn commit -m 'Adding a file'

14
Mẹo tuyệt vời. Tốt hơn nhiều so với việc sử dụng trạng thái svn. "svn add --force" dường như là đủ.
Tên

1
Có một cách dễ dàng để đặt điều này thành một macro rút ngắn (nghĩa là, như bạn có thể với git)? Ngoài ra, có thể cập nhật câu trả lời này để nó giải thích từng bit không?
MrDuk

2
@MrDuk: Rút ngắn: alias magic="svn add --force * --auto-props --parents --depth infinity -q"- Giải thích:svn help add
Ronan

17
Vấn đề là bổ sung bỏ qua tập tin chính xác? Không mong muốn.
ladieu

1
@ Tên - bạn cần đặt *ở cuối, nếu không nó sẽ không hoạt động (cho thuê đối với tôi)
vsync

72

Đây là một câu hỏi khác với tôi nhưng có một câu trả lời thuộc về câu hỏi này:

svn status | grep '?' | sed 's/^.* /svn add /' | bash

8
Điều này sử dụng các công cụ UNIX (grep, sed, bash) mà OP cho biết ông không có.
Naaff

3
Ngoài ra, bạn có thể đào sed và grep trên windows nếu bạn thực sự muốn.
Sam Saffron

1
Xin lỗi vì upvote trên bình luận của Cygwin, không cố ý (và tôi không thể hoàn tác nó). Trong thực tế, tôi nghĩ rằng Cygwin xấu như bạn có thể có trên Windows. Bạn vẫn có thể sử dụng findstr thay vì grep sẽ hoạt động ít nhất kể từ Windows 2000 mà không cần cài đặt thêm bất cứ thứ gì.
Joey


2
Tôi với mbyrne215; câu trả lời này đã giúp tôi nhiều hơn giải pháp của OP, vì vậy tôi đang bỏ phiếu. Hoạt động hoàn hảo trong OS X 10.6.7.
Asbjørn Ulsberg

37

Cái này hoạt động thế nào:

c:\work\repo1>svn add . --force

Thêm nội dung của thư mục con.

Không thêm các tập tin bị bỏ qua.

Liệt kê những tập tin đã được thêm vào.

Dấu chấm trong lệnh chỉ ra thư mục hiện tại, điều này có thể được thay thế bằng tên hoặc đường dẫn thư mục cụ thể nếu bạn muốn thêm một thư mục khác với thư mục hiện tại.


Trên thực tế điều đó nên .\*hoặc nếu svn root nằm trên một thư mục khác stuff\svn_root\*.
Nux

Tôi không làm theo. Các lệnh để SVN thực thi trong bối cảnh đường dẫn mà chúng được thực thi, đây là điều được mong đợi. "svn add. \ *" một mình không tái diễn và in ra một tải thư rác cảnh báo khiến không thể thấy những gì thực sự được thêm vào. "svn add. \ * --force" không lặp lại mà còn in "svn: Bỏ qua đối số: E200025: '. \. svn' kết thúc bằng một tên dành riêng". Vì vậy, điều đó có vẻ tồi tệ hơn giải pháp ban đầu của tôi.
Neutrino

Tôi đã chỉ ra rằng có lẽ bạn không có toàn bộ ổ C trên SVN ;-), và vì vậy bạn nên thêm một đường dẫn. Và từ đường dẫn cụ thể thử nghiệm của tôi khi stuff\svn_rootkhông thêm tệp trong thư mục con (ví dụ: trong stuff\svn_root\already_in_svn\not_in_svn.txt). Do đó ngôi sao ở cuối.
Nux

@Nux Chỉ bây giờ sau tất cả những năm này, cuối cùng tôi cũng thấy những gì bạn đang nhận được :) Trong lệnh, dấu chấm là đường dẫn chỉ định thư mục hiện tại. Đương nhiên bất kỳ thay thế hợp lệ có thể được cung cấp thay thế.
Neutrino

Đây là câu trả lời đúng. Tôi không chắc làm thế nào một giải pháp bao gồm thêm các tệp bị bỏ qua có vị trí hàng đầu. @Neutrino, đề nghị xóa nhận xét của bạn cho joey không còn xuất hiện trên trang này và cũng thêm một dòng củng cố rằng đề xuất của bạn KHÔNG thêm các tệp bị bỏ qua
b_levitt

35

Điều này làm việc cho tôi:

svn add `svn status . | grep "^?" | awk '{print $2}'`

( Nguồn )

Như bạn đã giải quyết vấn đề của mình cho Windows, đây là một giải pháp UNIX (theo Sam). Tôi đã thêm vào đây vì tôi nghĩ nó vẫn hữu ích cho những ai đạt được câu hỏi này yêu cầu điều tương tự (vì tiêu đề không bao gồm từ khóa "WINDOWS").

Lưu ý (Tháng 2, 2015): Theo nhận xét của "bdrx", lệnh trên có thể được đơn giản hóa hơn nữa theo cách này:

 svn add `svn status . | awk '/^[?]/{print $2}'`

1
Đẹp, nhỏ gọn, súc tích, cũng cho vay để mở rộng khá tốt. Cảm ơn.
Norman H

1
Tuyệt quá. Cũng dễ dàng mở rộng, sửa đổi để xóa, v.v.
Drewid

Hoàn hảo cho những gì tôi cần. Cảm ơn bạn!
Jeff

2
Tại sao mọi người luôn grep và sau đó ống để awk? Awk có thể làm khớp mẫu : awk '/^[?]/{print $2}'; Không cần cho quá trình grep thêm.
bdrx

1
@bdrx: Có lẽ vì grep thường được kết hợp với khớp mẫu? Trong trường hợp cá nhân của tôi, tôi có nhiều kinh nghiệm với grep hơn là với awk. Tôi đã không biết rằng bạn có thể làm những việc như vậy trong awk, vì vậy tôi sẽ bắt đầu sử dụng awk nhiều hơn trong các kịch bản của mình. Cảm ơn!
lepe

5
svn add --force .

Điều này sẽ thêm bất kỳ tập tin không đảo ngược trong thư mục hiện tại và tất cả các thư mục con được phiên bản.


5

Phương pháp này sẽ xử lý tên tệp có bất kỳ số / kết hợp khoảng trắng nào trong chúng ...

svn status /home/websites/website1 | grep -Z "^?" | sed s/^?// | sed s/[[:space:]]*// | xargs -i svn add \"{}\"

Dưới đây là một lời giải thích về những gì lệnh đó làm:

  • Liệt kê tất cả các tập tin thay đổi.
  • Giới hạn danh sách này thành các dòng có '?' lúc bắt đầu - tức là các tập tin mới.
  • Gỡ bỏ '?' nhân vật ở đầu dòng.
  • Loại bỏ khoảng trắng ở đầu dòng.
  • Đặt tên tệp thành xargs để chạy svn thêm nhiều lần.

Sử dụng đối số -i cho xargs để xử lý việc có thể nhập tên tệp có dấu cách vào 'svn add' - về cơ bản, -i đặt {} được sử dụng làm trình giữ chỗ để chúng tôi có thể đặt "các ký tự xung quanh tên tệp được sử dụng bởi 'svn thêm vào'.

Một lợi thế của phương pháp này là điều này sẽ xử lý tên tệp có khoảng trắng trong chúng.


Điều này giả định Linux hoặc tương tự (ví dụ MinGW hoặc Cygwin ). OP tuyên bố: "Máy chủ của tôi đang chạy Windows Server 2003 nên giải pháp Unix sẽ không hoạt động."
Peter Mortensen

4

TortoiseSVN được tích hợp khả năng này, nếu bạn sẵn sàng sử dụng giải pháp không phải là dòng lệnh. Chỉ cần nhấp chuột phải vào thư mục cấp cao nhất và chọn Thêm ...


Với kho lưu trữ khổng lồ TortoiseSVN bị treo. Điều này khiến tôi tìm kiếm các lựa chọn thay thế dòng lệnh :-)
Upendra


3

Sử dụng:

svn st | grep ? | cut -d? -f2 | xargs svn add

1
Hoặc bạn có thể sử dụng cắt để thực hiện công việc của grep: svn status | cut -d ? -f 2 -s | xargs svn add
Eric3

Điều này giả định Linux hoặc tương tự (ví dụ MinGW hoặc Cygwin ). OP tuyên bố: "Máy chủ của tôi đang chạy Windows Server 2003 nên giải pháp Unix sẽ không hoạt động."
Peter Mortensen

3

Tôi luôn luôn sử dụng:

Sao chép dán

svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1

1
Op explomatic nói rằng một giải pháp Unix không có ích với anh ta.
Neutrino

Điều này giả định Linux hoặc tương tự (ví dụ MinGW hoặc Cygwin ). OP tuyên bố: "Máy chủ của tôi đang chạy Windows Server 2003 nên giải pháp Unix sẽ không hoạt động."
Peter Mortensen

3

Vì bài đăng này được gắn thẻ Windows, tôi nghĩ rằng tôi sẽ tìm ra giải pháp cho Windows. Tôi muốn tự động hóa quá trình, và tôi đã tạo một tập tin bat. Tôi đã chống lại việc tạo một console.exe trong C #.

Tôi muốn thêm bất kỳ tệp hoặc thư mục nào không được thêm vào kho lưu trữ của tôi khi tôi bắt đầu quá trình cam kết.

Vấn đề với nhiều câu trả lời là họ sẽ liệt kê các tệp không được đảo ngược nên được bỏ qua theo danh sách bỏ qua của tôi trong TortoiseSVN .

Đây là cài đặt hook và tệp bó của tôi.

Rùa Hook Script:

"start_commit_hook".
(where I checkout) working copy path = C:\Projects
command line: C:\windows\system32\cmd.exe /c C:\Tools\SVN\svnadd.bat
(X) Wait for the script to finish
(X) (Optional) Hide script while running
(X) Always execute the script

svnadd.bat

@echo off

rem Iterates each line result from the command which lists files/folders
rem     not added to source control while respecting the ignore list.
FOR /F "delims==" %%G IN ('svn status ^| findstr "^?"') DO call :DoSVNAdd "%%G"
goto end

:DoSVNAdd
set addPath=%1
rem Remove line prefix formatting from svn status command output as well as
rem    quotes from the G call (as required for long folder names). Then
rem    place quotes back around the path for the SVN add call.
set addPath="%addPath:~9,-1%"
svn add %addPath%

:end

2
for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%i %%j"

Trong quá trình triển khai này, bạn sẽ gặp rắc rối trong trường hợp thư mục / tên tệp của bạn có nhiều khoảng trống như bên dưới:

"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Sega Mega      2"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\One space"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Double  space"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Single"

trường hợp như vậy được bao phủ bởi đơn giản:

for /f "usebackq tokens=1*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%j"

2

Nếu bạn sử dụng Linux hoặc sử dụng Cygwin hoặc MinGW trong windows, bạn có thể sử dụng các giải pháp giống như bash như sau. Tương phản với những cái tương tự khác được trình bày ở đây, cái này sẽ đưa vào không gian tên tệp tài khoản:

svn status| grep ^? | while read line ; do  svn add "`echo $line|cut --complement -c 1,2`" ;done

Cái này để làm gì? Sê-ri? Bash? Nó trông giống như Bash (hoặc một vỏ tương tự). Trong trường hợp đó, nó giả sử Linux hoặc tương tự (ví dụ MinGW hoặc Cygwin ). OP tuyên bố: "Máy chủ của tôi đang chạy Windows Server 2003 nên giải pháp Unix sẽ không hoạt động."
Peter Mortensen

Cảm ơn, bạn đã đúng, khi tôi ở Windows tôi sử dụng Cygwin với Bash. Tuy nhiên, tuyên bố "Máy chủ của tôi đang chạy Windows Server 2003 vì vậy một giải pháp Unix sẽ không hoạt động." là sai. Có thể anh ta không muốn sử dụng Cygwin hoặc MinGW, nhưng anh ta đã không thể hiện bản thân theo cách đó. Tôi đã điều chỉnh lại câu trả lời.
ajaest

1

Sau khi dành một chút thời gian cố gắng tìm ra cách chỉ đệ quy một số tệp, tôi nghĩ rằng nó sẽ hợp lệ để chia sẻ những gì đã làm cho tôi:

FOR /F %F IN ('dir /s /b /a:d') DO svn add --depth=empty "%F"
FOR /F %F IN ('dir /s /b /a *.cs *.csproj *.rpt *.xsd *.resx *.ico *.sql') DO svn add "%F"

Dưới đây là một số lời giải thích.

Lệnh đầu tiên thêm tất cả các thư mục. Lệnh thứ hai chỉ thêm các tệp tương ứng với các mẫu đã chỉ định.

Hãy để tôi cung cấp thêm chi tiết:

  • CHO: bạn biết, điều khiển vòng lặp.
  • / F: có nghĩa là lấy các tệp và thư mục (không chắc chắn chính xác).
  • % F: đó là một biến; nó sẽ giả sử giá trị của từng tệp được liệt kê tại một thời điểm; nó có thể có một tên nhân vật khác.
  • IN: không cần phải giải thích, phải không?
  • ('dir / s / b / a: d'): lệnh DOS sẽ liệt kê các thư mục; trong trường hợp của tôi / s là đệ quy, / b chỉ lấy toàn bộ đường dẫn, / a: d chỉ có nghĩa là thư mục; thay đổi nó như bạn muốn giữ dấu ngoặc đơn và dấu nháy đơn.
  • DO: có nghĩa là những gì tiếp theo trong lệnh là những gì sẽ được thực thi cho mỗi thư mục
  • svn add --depth = blank: đó là lệnh SVN mong muốn được chạy; định nghĩa độ sâu có nghĩa là chỉ thêm thư mục chứ không phải các tệp bên trong chúng.
  • "% F": đó là cách bạn sử dụng biến được xác định trước đó.

Trong lệnh thứ hai, sự khác biệt duy nhất là lệnh dir và lệnh svn, tôi nghĩ rằng nó đủ rõ ràng.


0

Bạn có thể sử dụng lệnh

svn add * force--

hoặc là

svn add <directory/file name>

Nếu tập tin / thư mục của bạn không thêm đệ quy. Sau đó kiểm tra cái này.

Thêm đệ quy là thuộc tính mặc định . Bạn có thể thấy trong cuốn sách SVN .

Vấn đề có thể nằm trong danh sách bỏ qua của bạn hoặc thuộc tính toàn cầu.

Tôi có giải pháp theo dõi vấn đề google

Kiểm tra các thuộc tính toàn cầu để bỏ qua sao (*)

  • Nhấp chuột phải vào repo của bạn trong cửa sổ. Chọn TortoiseSVN > Properties.
  • Xem nếu bạn không có tài sản svn:global-ignores with a value of *
  • Nếu bạn có tài sản với star(*)nó thì nó sẽ bỏ qua việc thêm đệ quy. Vì vậy, loại bỏ tài sản này.

Kiểm tra mẫu bỏ qua toàn cầu để bỏ qua sao (*)

  • Nhấp chuột phải vào repo của bạn trong cửa sổ. Chọn TortoiseSVN > Settings > General.
  • Xem trong Mô hình bỏ qua toàn cầu, nếu bạn chưa đặt sao (*) ở đó.
  • Nếu bạn tìm thấy star(*), loại bỏ tài sản này.

Anh chàng này cũng giải thích lý do tại sao tài sản này được thêm vào trong dự án của tôi.

Cách giống như cách mà nó nhận được là có ai đó nhấp chuột phải vào tệp mà không có bất kỳ tiện ích mở rộng nào và chọn TortoiseSVN -> SVN Bỏ qua -> * (đệ quy), và sau đó cam kết điều này.

Bạn có thể kiểm tra nhật ký để xem ai đã cam kết thay đổi tài sản đó, tìm hiểu xem họ thực sự đang cố gắng làm gì và yêu cầu họ cẩn thận hơn trong tương lai. :)


0

Bạn có thể nhập lệnh sau trên Linux:

find ./ -name "*." | xargs svn add

0

Vì anh ấy đã chỉ định Windows, nơi awk & sed không chuẩn:

for /f "tokens=1*" %e in ('svn status^|findstr "^\?"') do svn add "%f"

hoặc trong một tệp bó:

for /f "tokens=1*" %%e in ('svn status^|findstr "^\?"') do svn add "%%f"

0

Đây là cách lười biếng và nguy hiểm để đồng bộ hóa thư mục với SVN bao gồm các tệp mới:

svn rm --keep-local dir
svn add dir

Mặc dù điều này có thể làm việc trong một nhúm nhưng nó cũng có thể có hậu quả nghiêm trọng. Ví dụ: SVN thường sẽ mất dấu vết về lịch sử của tệp.

Cách lý tưởng để đồng bộ hóa một thư mục là có thể tìm khác sau đó sử dụng bản vá svn, tuy nhiên điều này lệch khỏi các định dạng trong lệnh diff và lệnh svn diff sẽ so sánh sự khác biệt của thư mục làm việc thay vì sự khác biệt ở cấp độ hệ thống tệp.


-1

Tôi nghĩ rằng tôi đã làm một cái gì đó tương tự với:

svn add . --recursive

nhưng không chắc bộ nhớ của tôi có đúng không;


2
chỉ là bản cập nhật cho bộ nhớ của bạn: svn 1.4 và 1.5 không hỗ trợ - đánh giá là tham số cho svn add :)
Ludwig Wensauer
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.