2010-03-09 6 views
99

私はMercurialで特定のファイルのみをコミットしようとしています。 変更をコミットしようとするたびにhgが自動追加されるため、すべてのファイルをコミットする必要があります。しかし、特定のファイルがまだ「準備ができていない」ため、私はそれを望んでいません。Mercurial(hg)は特定のファイルのみをコミットします

あり

hg commit -I thefile.foo 

であるが、これは一つだけのファイルです。もっと良い方法は私がGitのように自動追加機能を無効にできるかどうかです。これは可能ですか?

+5

は、レコードの拡張子を使用:あなたの.hgrcに次の追加することによって、hg commit --config ui.interface=curses --interactiveまたは一般的に単一の実行のためにそれを行うことができますか?またはコマンドライン 'hg ci foo bar baz'でファイルを指定することができます – tonfa

+3

@tonfa、答えとしてあなたのコメントを投稿してください – develop7

+0

あなたの投稿を破壊しないでください。 – Glorfindel

答えて

133

あなたは、コマンドラインでファイルを指定することができます。また、あなたが見つけた--includeフラグを使用することができ、そして、あなたはそれをこのように複数回使用することができます。

$ hg commit -I foo.c -I "**/*.h" 

あなたも、あなたがコミットしたいファイルを選択するために、filesetを使用することができます。

$ hg commit "set:size(1k - 1MB) and not binary()" 

自動追加動作を無効にし、GitのようにMercurialを動作させる設定はありません。しかし、mq extensionが興味深いかもしれません。それは、高度な拡張だが、それは私はそれだけで、コマンドラインでファイル名を指定するのに十分だと思うので、私は本当に、しかし、この目的のために自分をMQを使用していない

$ hg qnew feature-x  # create new patch 
$ hg qrefresh -s foo.c # add a file to the current patch 
$ hg qrefresh -s bar.c # add another file to the patch 
$ hg qfinish -a   # convert applied patches to normal changesets 

にあなたができます。

0

this Stack Overflow questionで提案されているように、これを行う最も簡単な方法はhg shelveです。ただ作品

$ hg commit foo.c foo.h dir/ 

をし、それは私がすべての時間を仕事だ:トンファーが書き込みとして

+1

シェルフはこれをどのように手助けしますか?ブランチの切り替えや未処理の変更について不平を言い表すものはありますが、選択コミットの場合は、コミットする必要があるものを選択するだけです。 – amertkara

+0

**最も単純な方法ではありませんが、動作します。これは 'git stash'と似ています:現在の作業ディレクトリから必要なものを削除し、残っているものだけをコミットできるようにします。 – marcelocra

20

いくつかのファイルをコミットしたくない場合は、他の多くのファイルを除外するには、コミットするファイルを明示的に指定します。 -Iは、ファイルの代わりにパターンを使用する場合にのみ必要です。

多くのファイルをコミットし、少数のファイルしか除外しない場合は、-Xを使用する方が便利です。

など。 「file_1」、「file_2」を含むリポジトリと「file_3」与えられた、以下は等価ですが、後者は入力しやすい/高速です:あなたはまた、ファイルを選択するために、hg commit --interactiveを使用することができます3.8のとおり

hg commit file_1 file_2 
hg commit -X file_3 
1

を(3.8より前には同様の機能のためにcrecord extensionを使用できます)。 --interactive(またはちょうど-i)フラグを指定すると、hgはコミットに含めるファイルを要求します。追加ボーナスとして、ファイル内にチャンクを追加/除外することもできます。

次に、インターフェイスの外観の例を示します。これは古いスクリーンショットです(実際はcrecordのものです)ので、インターフェイスはわずかに変更されています(しかし、基本は同じです)。 crecord screenshot

このインターフェイスを取得するには、cursesインターフェイスが有効になっている必要があります。

[ui] 
interface = curses 
関連する問題