Mercurial:从修订版中获取更改的文件?

时间:2010-11-13 13:49:32

标签: version-control mercurial tortoisehg

我无法理解如何只获取上一版本中更改的文件,而不是我使用Clone获得的完整repo。这对于例如部署最后更改的文件非常有帮助。

我该怎么办?

由于

3 个答案:

答案 0 :(得分:4)

您无法仅传输某些文件 - 您必须始终在本地拥有完整克隆。所以我建议你做一次,然后逐步拉入变化。

然后,您应该使用hg status来显示修改后的文件名称。您通常使用hg status查看哪些文件与工作副本父版本相比发生了变化,但您可以将--rev传递给状态以查看任意两个版本之间的更改!

所以使用

$ hg status --change tip

查看提示更改集中更改了哪些文件。使用

 $ hg pull
 $ hg status --rev .:tip

查看在拉动后执行hg update时将更改哪些文件。更新将带您从当前工作目录parent(由.表示)到tip,假设您与tip位于同一个命名分支上。否则hg update会将您带到当前分支上的最末端变更集。

答案 1 :(得分:2)

您可以使用hg loghg tip模板获取所有文件名:

hg tip --template '{files}'

或者例如所有文件由changeset 5更改/添加/修改:

 hg log -r5  --template '{files}'

您可以阅读有关模板Mercurial: The Definitive Guide, Chapter 11. Customizing the output of Mercurial的更多信息或有关hg help templating`

的简短帮助

如果您想对文件执行某些操作,例如grep:

hg tip --template '{files}' | xargs grep foo  

小心这会打破包含空格的文件名!

要处理所有类型的文件名,需要更复杂的东西(感谢#mercurial上的mg提示):

我们需要多行样式,假设名为zerosep的文件包含:

changeset = "{files}"
file = "{file}\0"

然后,您可以使用它来生成\0个单独的文件名列表,并使用xargs -0处理它:

hg tip --style zerosep | xargs -0 grep foo

有关其工作原理的信息,请参阅:Listing files on multiple lines

答案 2 :(得分:1)

Martin有正确的方法来获取修订版中已更改文件的列表,我已经提出了他的答案,但只是为了扩展为什么你的问题有点偏离:

在Mercurial中,每个位置都有一个包含所有更改的完整副本。如果您要使用Mercurial部署到您的服务器,那么您必须将所有内容克隆到您的服务器 - 一次。之后,推/拉将仅移动服务器尚未拥有的(压缩)变更集。

如果您不想拥有服务器上的所有内容,那么您需要使用mercurial之外的其他内容进行部署,可能是从Martin显示的状态命令或从{{1}创建的快照中提供的内容}。

就个人而言,我可以在服务器上拥有完整的历史记录,并且只需在服务器上为每个新部署执行hg archive。它整洁有效。