繁体   English   中英

mercurial hg partial checkin

[英]mercurial hg partial checkin

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

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

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

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

感谢所有的答案

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

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

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

如果要逐个文件选择文件,可以使用record命令 它带有mercurial,但如果你想通过在~/.hgrc[extensions]部分放置: record=来使用它,你必须打开它。

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

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增加了逐步处理更改并在它们之间移动的能力,方法是pushpop然后关闭堆栈(或者我猜测“队列”)。 因此,如果我有一组未提交的更改,我需要拆分,我会:

> 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是不可能的。 正如已经建议的那样,有几种方法可以选择要提交的文件。 要通过提交消息模板获取此功能,您需要包含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

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

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

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

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

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

第三,提交这些文件:

hg commit `cat /tmp/changedlist.txt`

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

或者,您可以使用增量添加更多文件到提交

`hg commit --amend file...`

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM