【发布时间】:2012-05-11 21:45:50
【问题描述】:
我正在使用 svn,有时我需要恢复一些不顺利的更改。我想先对更改的文件进行压缩。我希望 zip 有完整的路径。我大部分时间都在使用 TortoiseSVN,但如果需要,我并不害怕使用命令行。
【问题讨论】:
标签: svn tortoisesvn zipfile
我正在使用 svn,有时我需要恢复一些不顺利的更改。我想先对更改的文件进行压缩。我希望 zip 有完整的路径。我大部分时间都在使用 TortoiseSVN,但如果需要,我并不害怕使用命令行。
【问题讨论】:
标签: svn tortoisesvn zipfile
您可以只使用一个简单的 bash 单行程序(前提是您是 Linux 用户):
zip ~/modified.zip $(svn status | grep ^M | awk '{ print $2;}')
这会提取所有状态为 M so Modified 的文件。
【讨论】:
在 TourtoiseSVN 检查修改对话框中
【讨论】:
您可以购买WinZip 的副本,或使用开源的7-Zip。两者都包含命令行版本,可以满足您的需求。它们都支持用作 Windows shell 扩展,这意味着您可以从 Windows 资源管理器中选择一个或多个文件,右键单击并从上下文菜单中执行压缩选项。 (顺便说一句,这比使用您发布的拖放解决方案要好。)
这两种产品都包含关于从命令行使用它们的非常好的文档,如果这是您选择的选项。
借助 7-Zip 的 shell 支持,您可以 Shift+Click 或 Ctrl+Click 选择文件,然后右键单击其中任何一个并从其中选择 7-Zip->Add to archive...上下文菜单。然后,您可以选中包含路径信息的选项。
WinZip 包含与 Windows shell 类似的功能,虽然我已经多年没有使用它并且无法给出具体的说明。
【讨论】:
Add to archive...,然后将更新模式更改为Update 或Freshen。同样,请参阅 7-Zip 文档(您可以打开所描述的对话框并单击 Help 按钮到达那里)。
这很粗糙,但很有效。
@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 zip myfiles.zip
其中 REV 是您要开始的修订号。通常在您退房时。
来源:http://www.semicolon.co.za/linux/get-list-of-changed-tiles-via-svn-diff-and-zip-them.html
【讨论】:
好的,我找到了一种方法,但对此并不完全满意。我正在回答我自己的问题,但我希望有人可以改进它。
【讨论】:
如果您同意在撤消之前提交(到某个不同的地方)这些更改(变成svn up PREV-REV),您可以使用"Files changed in revision" tricks中的任何一个
对于 TortoiseSVN 最新版本,GUI 方式 ("Exporting only changed files in TortoiseSVN between versions") 可能是您的首选方法
【讨论】:
虽然Boscabouter's answer 在一台机器上对我来说工作得很好,但我注意到在另一台机器上 TortoiseSVN 的上下文菜单中没有 Shell 条目。因此,我无法轻松地将文件从 检查修改 对话框发送到 7zip。
基于Ken White's input,我使用命令行将文件移动到存档:
filelist.txt
"%ProgramFiles%"\7-Zip\7z a -tzip modified.zip @filelist.txt
除了步骤 1 - 3,您还可以运行 svn status | find "M " > filelist.txt 并使用文本编辑器删除不需要的行/字符。
【讨论】: