mercurial hg partial checkin

时间:2013-06-06 17:57:54

标签: version-control mercurial

这是一个非常简单和愚蠢的问题,

我正在处理2个任务,并在代码中修改了2组文件。

现在当我输入'hg ci'时,它会检入所有文件。我可以从签到中删除某些文件,即只检查一项任务吗?

如果我删除了“签入消息”中的文件,它们将从签入中删除

感谢所有答案

这似乎是一个很大的缺陷,我的用例非常简单和一般。大多数时候开发人员正在处理各种任务,有些已准备好,有些则没有,错误修复等。

现在唯一的简单解决方案似乎是多个本地回购或克隆

5 个答案:

答案 0 :(得分:4)

使用hg ci <files>...仅提交工作目录中的某些文件。

答案 1 :(得分:4)

如果您想逐个文件选择,可以使用record command。它带有mercurial,但是如果你想通过将record=放在[extensions]的{​​{1}}部分中来使用它,就必须打开它。

它会被大块头扯掉,但你可以回答整个文件:

~/.hgrc

我会指出,如果您提交的是某些文件而不是其他文件,则可以肯定的是,如果没有其他文件,您就不会在一次更改上运行测试套件,但这可能不适用于您的情况。< / p>

答案 2 :(得分:2)

这里真正的问题是你正在做一些与不同任务混杂在一起的变化。 Mercurial有几种方法可以让事情分开。

任务分支

假设您一直在处理某项任务,并且自上次提取以来已经过几次检查,但事情尚未准备好分享。

o----o----B----o----o----o

此处,B是您开始更改的修订版。我们所做的是(在确认我们当前的更改已签入后):

> hg update -r B
<do our work on the other task>
> hg commit

我们现在已经创建了一个新分支,其中此任务的更改与原始任务的更改分开。

o----o----B----o----o----o
           \
            ----o

我们可以根据需要为不同的任务执行此操作。唯一的问题是有时候记住哪个分支可能很尴尬。这就是像bookmarks这样的功能有用的地方。书签是一个标签,它在提交时向前移动,以便始终指向分支的头部。

Mercurial Queues

MQ增加了逐步处理更改并通过pushpop然后离开堆栈(或者我猜的“队列”)在它们之间移动的功能。因此,如果我有一组未提交的更改,我需要拆分,我会:

> hg qrecord taska
> hg qrecord taskb
> hg qrecord taskc

我使用record扩展名(或更可能是crecord扩展名)来选择我要选择的文件部分。

如果我需要返回taska并进行一些更改:

> hg qpop; hg qpop    # pop two off the queue to go back to task a
<Do changes>
> hg qrefresh         # update task a with the new changes

当我想将队列转换为正常的变更集时:

> hg qpush or hg qpop # get the changes I want converted onto the queue
> hg qfinish -a       # converts mq changes to normal changesets

还有其他方法,但现在也可以。

答案 3 :(得分:2)

开箱即用mercurial是不可能的。正如已经建议的那样,有几种方法可以选择要提交的文件。要通过提交消息模板获取此功能,您需要包含commit命令的扩展或shell脚本。这是一种方法:

[alias]
ci = ! hg-partial-commit

HG-局部提交:

#!/bin/sh
# partial commit

edit=$(mktemp ${TMPDIR:-/tmp}/$(basename $0).XXXXXXXXXXXX)
filelist=$(mktemp ${TMPDIR:-/tmp}/$(basename $0).XXXXXXXXXXXX)
logmessage=$(mktemp ${TMPDIR:-/tmp}/$(basename $0).XXXXXXXXXXXX)
cleanup="rm -f '$edit' '$filelist' '$logmessage'"
trap "$cleanup" 0 1 2 3 15

(
    echo user: $(hg debugconfig ui.username)
    echo branch: $(hg branch)
    hg parents --template 'parent: {rev}:{node|short}  {author}  {date|isodate}\n'
    echo
    echo 'Enter commit message.  Select files to commit by deleting lines:'
    hg status 'set:not unknown()' | sed -e 's/^/@/'
) | sed -e 's/^/HG: /' >"$edit"

${VISUAL:-${EDITOR:-vi}} "$edit"
egrep -v '^HG:' "$edit" >"$logmessage"
egrep '^HG: @' "$edit" | cut -c8- >"$filelist"

hg commit -l "$logmessage" "listfile:$filelist"
$cleanup

答案 4 :(得分:0)

您将不可避免地要么指定要添加的文件,要么指定要省略的文件。如果你有很多文件,如上所示,以下步骤将简化程序(我假设这是一个UNIX-ish系统,Windows会略有不同)。

首先,生成已更改文件的列表:

hg status -mard -n >/tmp/changedlist.txt

-mard选项将列出已修改,添加,删除或延迟的所有文件。 -n选项将列出没有状态前缀的选项,以便您拥有的只是一个原始文件列表。

其次,使用您喜欢的文本编辑器编辑/tmp/changedlist.txt,使其仅包含您要提交的文件。

第三,提交这些文件:

hg commit `cat /tmp/changedlist.txt`

在实际执行提交之前,您将能够查看要提交的文件。

或者,您可以使用

以递增方式向提交添加更多文件
`hg commit --amend file...`

此处,hg commit --amend不会创建新提交,而是将新文件添加到现有提交中。因此,您首先提交几个文件,然后逐步添加更多文件,直到完成为止。这仍然需要您输入所有内容。

对于另一种替代方法,您可以使用Mercurial Queues以更复杂的方式拆分提交,但这更像是一个高级主题。