我正在使用 svn,有时我需要恢复一些不顺利的更改。我想先对更改的文件进行压缩。我希望 zip 有完整的路径。我大部分时间都在使用 TortoiseSVN,但如果需要,我并不害怕使用命令行。
10 回答
您可以只使用一个简单的 bash 单行代码(前提是您是 Linux 快乐用户):
zip ~/modified.zip $(svn status | grep ^M | awk '{ print $2;}')
这将提取所有状态为 M so Modified 的文件。
在TourtoiseSVN 检查修改对话框中
- 选择你想要的文件
- 右键点击
- 然后 shell 上下文菜单将它们发送到 7zip
您可以购买WinZip的副本,或使用开源的7-Zip。两者都包含命令行版本,可以满足您的需求。它们都支持用作 Windows shell 扩展,这意味着您可以从 Windows 资源管理器中选择一个或多个文件,右键单击并从上下文菜单中执行压缩选项。(或者比使用您发布的拖放解决方案更好,顺便说一句。)
这两种产品都包含关于从命令行使用它们的非常好的文档,如果这是您选择的选项。
借助 7-Zip 的外壳支持,您Shift+Click可以Ctrl+Click选择文件,然后右键单击其中任何一个并7-Zip->Add to archive...
从上下文菜单中进行选择。然后,您可以选中包含路径信息的选项。
WinZip 包含与 Windows shell 类似的功能,尽管我已经多年没有使用它并且无法给出具体的说明。
这很粗糙,但很有效。
@echo ================================================
@echo ZIPS all modified or added svn controlled files
@echo to the specified zip file
@echo "svnzipmodified <filename>"
@echo ================================================
@if "%1"=="" goto end
@echo Getting list of modified or added files
@echo ================================================
svn status -q > list.txt
@echo Strip status text to leave path and filename
@echo ================================================
find "M " list.txt > list2.txt
find "A " list.txt >> list2.txt
(for /F "tokens=1,2*" %%i in (list2.txt) do @echo %%j) > list3.txt
@echo Zip up files
@echo ================================================
del %1 /Q
"C:\Program Files\MATLAB\R2010a\bin\win64\zip.exe" %1 -@ < list3.txt
pause
del list3.txt /Q
del list2.txt /Q
del list.txt /Q
@echo Done
@echo ================================================
:end
您可以将本地更改保存到文件中:
svn diff > my_changes.patch
以后可以通过以下方式恢复这些更改:
patch -p0 < my_changes.patch
我喜欢这个解决方案,因为它可以在 Windows 和 Mac 上稍作修改。
下载命令行颠覆客户端。在 Windows 上,请在http://sliksvn.com/en/download/上查看 SlikSVN, 因为 TortoiseSVN 不提供。
如果没有,请下载 Python 3.x。
下载 7zip 并将其添加到您的路径中。
执行:
import os
import re
import subprocess
import time
re_svn = re.compile(r'(.)\s+(.+)$')
files = []
for line in os.popen('svn status -q').readlines():
match = re_svn.match(line)
if match:
files.append(match.group(2))
if len(files) > 0:
subprocess.call(['7z','a',time.strftime('%Y%m%d-%H%M%S') + '.zip'] + files)
注意:学习 Python,但这似乎可行。
在 linux 中,你会这样做。
svn diff -r REV:HEAD --summarize | sed 's/[A-Za-z][ ]+//' | xargs 压缩 myfiles.zip
其中 REV 是您要开始的修订号。通常在您退房时。
来源:http ://www.semicolon.co.za/linux/get-list-of-changed-tiles-via-svn-diff-and-zip-them.html
好的,我找到了一种方法,但对此并不完全满意。我正在回答我自己的问题,但我希望有人可以改进它。
- 使用 WinZip 创建一个空的 zip 文件,并选择包含完整路径信息。在 WinZip 中打开 zip。我无法弄清楚如何使用本机 Windows zip 实用程序执行此操作。
- 在工作副本中,使用 TourtoiseSVN 上下文菜单打开检查修改对话框。
- 选择对话框中的所有文件并将它们拖放到 WinZip 中。
如果您可以同意在撤消之前提交(到某个不同的地方)这些更改(变为 just svn up PREV-REV
),您可以使用任何“文件在修订中更改”技巧
对于 TortoiseSVN 最新的 GUI 方式(“仅在版本之间导出 TortoiseSVN 中更改的文件”)可能是您的首选方法
尽管Boscabouter 的回答在一台机器上对我来说效果很好,但我注意到在另一台机器上TortoiseSVN在其上下文菜单中没有Shell条目。因此,我无法轻松地将检查修改对话框中的文件发送到7zip。
根据Ken White 的输入,我使用命令行将文件移动到存档:
- 打开TortoiseSVN 检查修改对话框,例如从存储库的基本目录中
- 标记您感兴趣的所有文件,右键单击任何文件并选择复制路径到剪贴板
- 将路径粘贴到临时文本文件中,例如
filelist.txt
,在同一目录中 - 在该目录中打开终端(例如 Shift + 右键单击 Windows Explorer 中的该文件夹,然后选择Open command prompt)
- 跑
"%ProgramFiles%"\7-Zip\7z a -tzip modified.zip @filelist.txt
作为步骤 1 - 3 的替代方法,您可以svn status | find "M " > filelist.txt
使用文本编辑器运行并删除不需要的行/字符。