SVN cmd更新而不恢复文件

SVN cmd to update without restoring files

我有一个 Windows 批次,它将 运行 定期从 SVNadd/remove 文件

我希望脚本执行以下操作:

  1. 从 SVN
  2. 中删除 所有在 Windows(非 SVN)中删除的文件
  3. 添加 尚未受版本控制的所有文件 (*.*)
  4. 提交 所有更改
  5. 更新文件夹以确保文件夹是最新的。

我有以下批次:

:: Go to my folder (already checked out as SVN folder)
cd C:\MyFolder\

:: Delete/Remove all missing files
svn status || ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }

:: Add new files
svn add *.*

:: Commit all changes
svn commit *.* -m ^"Committed on %date% %time%"

:: Update the folder
svn up --accept mine-full

我自己在 Windows Explorer

中删除文件 new file.txt 后会发生什么
  1. 删除命令 运行s 然后列出文件 ! new file.txt
  2. 添加命令运行s,添加所有新文件
  3. 提交
  4. 更新然后恢复文件 new file.txt <-- 我不希望它恢复已删除的文件。

对于 Delete/Remove 部分我也尝试了这两个命令:

svn status || grep "^\!" || sed 's/^\! *//g' || xargs svn rm
svn status || grep "^\!" | sed 's/^\! *//g' | gawk '{print "\""[=11=]"\"" }' | xargs svn rm  ::includes whitespaces in filenames

输出:

C:\MyFolder>svn status   || ? { $_ -match '!\s+(.*)' }   | { svn rm $Matches[1] }
!       new file.txt

C:\MyFolder>svn add *.*
svn: Skipping argument: E200025: '.svn' ends in a reserved name
svn: warning: W150002: 'C:\MyFolder\old.txt' is already under 
version control
svn: E200009: Could not add all targets because some targets are already 
versioned
svn: E200009: Illegal target for the requested operation

C:\MyFolder>svn commit *.* -m "Committed on 2018-10-23 12:15:57.90"
svn: Skipping argument: E200025: '.svn' ends in a reserved name

C:\MyFolder>svn up --accept mine-full
Updating '.':
Restored 'new file.txt'
At revision 21.
Press any key to continue . . .

最重要的是,文件夹必须同步到 SVN(备份),所以如果有文件 added/deleted,SVN 中也必须是 added/deleted

也许您可以使用 "cut" 来执行删除部分,就像这样(它会获取上一个输出的第 9 列的所有内容):

svn status | grep "^\!" | cut -c 9- | xargs svn rm

终于自己搞定了。感谢

中的@user3689460

我已经添加了 svn delete "missing.list" 否则它将 missing.list 文件添加到 SVN

这是我的最终批处理脚本:

:: Go to my folder (already checked out as SVN folder)
cd C:\MyFolder\

:: Delete/Remove all missing files
svn status | findstr /R "^!" > missing.list
for /F "tokens=* delims=! " %%A in (missing.list) do (svn delete "%%A")
del missing.list 2>NUL
svn delete "missing.list"

:: Commit Deletion of missing files
svn commit -m "Deleted files from MyFolder on %date% %time%"

:: Add new files
svn add *.*

:: Commit all changes and additions
svn commit *.* -m ^"Committed MyFolder on %date% %time%"

:: Update the folder
svn up --accept mine-full