我有一个个人的Mercurial存储库,可以跟踪我正在进行的一些更改。我想与协作者分享这些更改,但是他们没有/不能获得Mercurial,因此我需要发送整个文件集,协作者将在他们的末尾合并。我正在寻找一种方法来提取在两个修订号之间修改的文件子集的“提示”版本。有没有办法在Mercurial中轻松完成这项工作?
添加赏金 - 这对我们来说仍然是一种痛苦。我们经常与内部“客户”合作,他们将我们的源代码版本作为.zip,并且测试一个小的修补程序更容易分发为.zip叠加而不是补丁(因为我们经常不知道他们的文件的状态)。
答案 0 :(得分:13)
最好的情况是给这些人施加适当的压力以获得Mercurial,但除此之外,补丁可能比压缩文件集更好,因为补丁将跟踪删除和重命名。如果你还想要一个zip文件,我写了一个制作zip文件的简短脚本:
import os, subprocess, sys
from zipfile import ZipFile, ZIP_DEFLATED
def main(revfrom, revto, destination, *args):
root, err = getoutput("hg root")
if "no Merurial repository" in err:
print "This script must be run from within an Hg repository"
return
root = root.strip()
filelist, _ = getoutput("hg status --rev %s:%s" % (revfrom, revto))
paths = []
for line in filelist.split('\n'):
try:
(status, path) = line.split(' ', 1)
except ValueError:
continue
if status != 'D':
paths.append(path)
if len(paths) < 1:
print "No changed files could be found."
return
z = ZipFile(destination, "w", ZIP_DEFLATED)
os.chdir(root)
for path in paths:
z.write(path)
z.close()
print "Done."
def getoutput(cmd):
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return p.communicate()
if __name__ == '__main__':
main(*sys.argv[1:])
使用将是nameofscript.py fromrevision torevision destination。例如,nameofscript.py 45 51 c:\updates.zip
对于糟糕的命令行界面感到抱歉,但是脚本只花了25分钟才写完。
注意:这应该从存储库中的工作目录运行。
答案 1 :(得分:10)
好。 hg export $base:tip > patch.diff
将生成一个标准的补丁文件,大多数工具都可以读取。
特别是,GNU patch
命令可以对前面的文件应用整个补丁。还不够吗?我不明白为什么你需要这些文件:对我来说,应用补丁似乎比从zip中提取文件并将它们复制到正确的位置更容易。 Plus ,如果您的协作者有本地更改,您将覆盖它们。您没有使用版本控制工具直接强制其他人手动合并 更改,对吗?让patch
诚实地处理这个问题:)
答案 2 :(得分:6)
在UNIX中,这可以通过以下方式完成:
hg status --rev 1 --rev 2 -m -a -n | xargs zip changes.zip
答案 3 :(得分:3)
我还提供了一个扩展程序,有关详情,请参阅hgexportfiles extension on bitbucket。导出文件扩展名适用于给定的修订版本或修订版本范围,并在指定的目录中创建一组已更改的文件。将目录压缩为脚本的一部分很容易。
答案 4 :(得分:1)
据我所知,没有一个方便的工具(虽然一个mercurial插件可能是可行的)。你可以导出文件集的补丁,使用hg export from:to
(来自和识别修订版的地方。)如果你真的需要在提示中看到的整个文件,你可能可能会同时破解一些东西在hg diff --stat -r from:to
的输出上,它输出一个文件列表,其中包含有关更改了多少行的注释,如:
...
src/test/scala/RegressionTest.scala | 25 +++++++++++++----------
src/test/scala/SLDTest.scala | 2 +-
15 files changed, 111 insertions(+), 143 deletions(-)
如果您的文件名称中没有空格或特殊字符,则可以使用以下内容:
hg diff -r156:159 --stat | head - --lines=-1 | sed 's!|.*$!!' | xargs zip ../diffed.zip
我会留下处理特殊字符作为读者的练习;)
答案 5 :(得分:1)
这是一个小而丑陋的bash脚本,可以完成这项工作,至少如果你在Linux环境中工作。这绝对没有检查过什么,并且当你移动文件时它很可能会中断但它是一个开始。
命令:
zipChanges.sh REVISION REPOSITORY DESTINATION
zipChanges.sh 3 /home/hg/repo /home/hg/files.tgz
代码:
#!/bin/sh
REV=$1
SRC_REPO=$2
DST_ZIP=$3
cd $SRC_REPO
FILES=$(hg status --rev $1 $SRC_REPO | cut -c3-)
IFS=$'\n'
FILENAMES=""
for line in ${FILES}
do
FILENAMES=$FILENAMES" \""$SRC_REPO"/"$line"\""
done
CMD="tar czf \"$DST_ZIP\" $FILENAMES"
eval $CMD
答案 6 :(得分:1)
我知道你已经对这个问题有了一些答案,但是我的一个朋友有类似的问题我在VB.Net中创建了一个简单的程序为他做这个也许它对你也有帮助,编程和一个源文件的副本位于以下链接文章的底部。
http://www.simianenterprises.co.uk/blog/mercurial-export-changed-files-80.html
虽然目前不允许您选择最终版本,但在使用源代码时添加它会非常容易,但是在提取文件之前必须手动更新到目标版本。 如果需要你甚至可以修改它来创建zip而不是文件夹(这也很好,很容易手动压缩)
希望这对您或任何想要此功能的人有所帮助。
答案 7 :(得分:1)
答案 8 :(得分:0)
我最近遇到了这个问题。我的解决方案:
hg update null
hg debugsetparents (starting revision)
hg update (ending revision)
这将删除在这两个修订版之间未更改的所有跟踪文件。但是,您必须自己删除任何未跟踪的文件。执行此操作后,本地分支将处于不一致状态;您可以通过运行hg debugrebuildstate
来解决此问题(或者只是删除本地分支,如果您不再需要它)。