这是一个非常简单和愚蠢的问题,
我正在处理 2 个任务并修改了代码中的 2 组文件。
现在,当我输入“hg ci”时,它会检入所有文件。我可以从签入中删除某些文件,即只检查一项任务吗?
如果我删除“签入消息”中的文件,它们将从签入中删除
感谢所有的答案
这似乎是一个很大的缺陷,我的用例非常简单和通用。大多数时候,开发人员都在处理各种任务,有些准备好了,有些还没有,错误修复等。
现在唯一简单的解决方案似乎是多个本地存储库或克隆
这是一个非常简单和愚蠢的问题,
我正在处理 2 个任务并修改了代码中的 2 组文件。
现在,当我输入“hg ci”时,它会检入所有文件。我可以从签入中删除某些文件,即只检查一项任务吗?
如果我删除“签入消息”中的文件,它们将从签入中删除
感谢所有的答案
这似乎是一个很大的缺陷,我的用例非常简单和通用。大多数时候,开发人员都在处理各种任务,有些准备好了,有些还没有,错误修复等。
现在唯一简单的解决方案似乎是多个本地存储库或克隆
用于hg ci <files>...
仅提交工作目录中的某些文件。
如果您想逐个文件选择文件,可以使用记录命令。它随 mercurial 一起提供,但如果你想使用它,你必须打开它,方法是record=
在[extensions]
你的~/.hgrc
.
它是一大块的,但你可以回答整个文件:
y - record this change
n - skip this change
s - skip remaining changes to this file
f - record remaining changes to this file
d - done, skip remaining changes and files
a - record all changes to all remaining files
q - quit, recording no changes
? - display help
我会指出,如果您提交了一些文件而不提交其他文件,则可以肯定您没有在没有其他更改的情况下运行测试套件,但这可能不适用于您的情况。
这里真正的问题是您正在做与不同任务相关的更改,这些任务混杂在一起。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
我们可以根据需要为尽可能多的不同任务执行此操作。唯一的问题是有时记住哪个分支是哪个分支可能很尴尬。这就是书签等功能派上用场的地方。书签是在提交时向前移动的标签,因此它始终指向分支的头部。
Mercurial 队列
MQ增加了增量处理更改的能力,并通过push
ing 和pop
ing 然后离开堆栈(或者我猜是“队列”)在它们之间移动。因此,如果我有一组需要拆分的未提交更改,我会:
> hg qrecord taska
> hg qrecord taskb
> hg qrecord taskc
我会使用记录扩展名(或更可能是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
还有其他方法,但现在就可以了。
开箱即用的 mercurial 无法做到这一点。正如已经建议的那样,有几种方法可以选择要提交的文件。要通过提交消息模板获取此功能,您需要一个扩展或一个包装提交命令的 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
您将不可避免地必须指定要添加的文件或要省略的文件。如果您有很多文件,如上所述,以下步骤将简化过程(我假设这里是 UNIX 系统,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 以更复杂的方式拆分提交,但这更像是一个高级主题。