2009-07-01 54 views
159

我正在尋找一種很好的方法來自動'svn添加'工作副本中的所有未版本控制的文件到我的SVN存儲庫。我如何將所有未版本控制的文件添加到SVN?

我有一個活的服務器,可以創建一些應該在源代碼管理下的文件。我想要一個簡短的腳本,我可以運行它來自動添加這些腳本,而不是一次一個地添加它們。

我的服務器正在運行Windows Server 2003所以Unix解決方案將無法工作。

+1

@Saul這個問題明顯早於你鏈接的問題,所以我不明白它是如何重複的。如果有其他問題是重複的。 – Neutrino 2014-02-13 12:03:56

+0

Cygwin是一個選項。在任何Windows環境中爲您提供bash的強大功能。用戶超過10年,遇到很小的問題。 – user151841 2014-12-03 02:02:53

回答

316

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

偉大的小費!一條評論:我的Eclipse自動將新文件添加到忽略列表。這可能是一個配置問題,但無論如何:有幫助的--no-ignore選項。

在此之後,你可以承諾:

svn commit -m 'Adding a file' 
63

這是一個不同的question to mine但關於這個問題的所屬的答案有:

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

這使用OP說他沒有的UNIX工具(grep,sed,bash)。 – Naaff 2009-07-01 23:55:02

+2

如果你真的想要的話,你也可以在Windows上挖掘sed和grep。 – 2009-07-02 05:13:37

+1

抱歉,對cygwin評論upvote,不是故意的(我不能撤消它)。事實上,我認爲cygwin和你在Windows上可以看到的一樣醜陋。你仍然可以使用findstr而不是grep,至少從Windows 2000開始工作,不需要額外安裝任何東西。 – Joey 2009-07-02 10:09:39

-2

我覺得我已經做了類似的事情:

svn add . --recursive 

但不知道如果我的內存是正確的; -p

3

TortoiseSVN內置此功能,如果您願意使用非命令行解決方案。只需右鍵單擊頂層文件夾並選擇添加 ...

2

用途:

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

這爲我工作:

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

Source

正如你已經解決您的問題適用於Windows,這是一個UNIX解決方案(遵循Sam)。我在這裏添加了,因爲我認爲它對於那些要求相同的事情的人仍然有用(因爲標題不包含關鍵字「WINDOWS」)。

(2月,2015年): 作爲評論由「bdrx」,上述命令可以以這種方式被進一步簡化:

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

此方法應處理具有任何數量/組合的文件名在他們的空間...

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

這裏是一個命令所做的解釋:

  • 列出所有更改的文件。
  • 將此列表限制爲包含'?'的行在開始 - 即新文件。
  • 刪除'?'字符在行首。
  • 刪除行首的空格。
  • 將文件名傳入xargs以多次運行svn add。

使用xargs的-i參數來處理能夠將文件名與空格導入到'svn add'中 - 基本上,-i sets {}用作佔位符,因此我們可以將「字符放在通過使用「svn添加」使用的文件名

這種方法的優點是,這應該處理與空格的文件名在其中

30

什麼工作原理是這樣的:

c:\>svn add . --force 

添加子目錄的內容

不添加被忽略的文件。

列出添加了哪些文件。

命令中的點表示當前目錄,如果要添加與當前目錄不同的目錄,則可以用特定的目錄名稱或路徑替換該目錄。

1

我總是用:

複製粘貼&

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

這會在當前目錄和所有版本的子目錄添加任何版本的文件。

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

在此實現中,你會遇到麻煩的情況下您的文件夾/文件名有類似下面一個以上的空間:

"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" 

這種情況下由簡單的覆蓋:

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

如果您在Windows中使用Linux或使用Cygwin或MinGW,則可以使用類似bash的解決方案。這裏的其它相似的人對比,這其中考慮到文件的命名空間:

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

由於這篇文章被標記爲Windows,我以爲我會爲Windows制定解決方案。我想讓這個過程自動化,並且製作了一個bat文件。我反對在C#中製作console.exe。

我想添加任何文件或文件夾,這些文件或文件夾在開始提交過程時未添加到我的存儲庫中。

很多答案的問題是,他們會列出未受版本控制的文件,根據我在TortoiseSVN中的忽略列表應該忽略這些文件。

這是我的鉤設置和批處理文件,它這是否

龜鉤子腳本:

"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 
0

花了一些時間嘗試弄清楚如何遞歸添加一些文件,我認爲這將是有效的分享什麼工作對我來說:

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" 

這裏有一些解釋。

第一個命令添加所有目錄。第二個命令僅將文件相應地添加到指定的模式。

讓我提供更多的細節:

  • FOR:你知道的,閉環控制。
  • /F:表示取文件和目錄(不確定)。
  • %F:它是一個變量;它會一次假定列出的每個文件的值;它可以有另一個單字符名稱。
  • IN:無需解釋,對吧?
  • ('dir/s/b/a:d'):將列出目錄的DOS命令;在我的情況下,/ s是遞歸的,/ b是隻取完整路徑,/ a:d只表示目錄;如果希望保留圓括號和撇號,請更改它。
  • DO:表示該命令的下一步是什麼將執行每個目錄
  • svn add --depth = empty:它是所需的SVN突擊隊將運行;深度定義意味着僅添加目錄而不添加其中的文件。
  • 「%F」:這就是你如何使用前面定義的變量。

在第二個命令中,唯一的區別是dir命令和svn命令,我認爲它已經足夠清楚了。

相關問題