这是一个非常简单和愚蠢的问题,
我正在处理2个任务,并在代码中修改了2组文件。
现在当我输入'hg ci'时,它会检入所有文件。我可以从签到中删除某些文件,即只检查一项任务吗?
如果我删除了“签入消息”中的文件,它们将从签入中删除
感谢所有答案
这似乎是一个很大的缺陷,我的用例非常简单和一般。大多数时候开发人员正在处理各种任务,有些已准备好,有些则没有,错误修复等。
现在唯一的简单解决方案似乎是多个本地回购或克隆
答案 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增加了逐步处理更改并通过push
和pop
然后离开堆栈(或者我猜的“队列”)在它们之间移动的功能。因此,如果我有一组未提交的更改,我需要拆分,我会:
> 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以更复杂的方式拆分提交,但这更像是一个高级主题。