2011-08-26 5 views
8

私はしばしばgit addをコミットのために一連のファイルを編集したが、それらのファイルを修正しなければならないChanged but not updatedの同じファイル。gitはすでにステージングされているファイルのみを再追加します

git addに実行できるライナーは、Changed but not updatedChanges to be committedのファイルのみですか?上記の例の場合

markdsievers$git status 
# On branch master 
# 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: src/com/foo/Bar.java 
# modified: src/com/foo/Foo.java 
# 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: src/com/foo/Bar.java 
# modified: src/com/foo/Foo.java 
# modified: src/com/foobar/FooBar.java 

私だけFoo.javaBar.javaなくFooBar.javaChanges to be committed:リストに追加します。

+0

あなたは 'git add -u'以外のものを考えていますか? –

+0

'git add -u'はfilepatternを必要としているようですが、そうでなければ' Foobar.java'を追加する '.'を使います。はい私は、私の考案した例を得るためにファイルパターンを追加することができ、それはうまくいくかもしれませんが、変更は単純ではなく、単一のファイルパターンが機能することはめったにありません。 – markdsievers

答えて

4

これは、1つの方法です:

git add -u $(git status --porcelain | grep ^MM | cut -d ' ' -f 2) 
+0

こんにちは、ありがとう。 ' - porcelain'について知りませんでした。私はこれがgitから尋ねるには不合理なものだとは思わなかったが、調整が必要な私のワークフローかもしれない。 – markdsievers

+0

これは私のためにはうまくいかなかった...変更されているがまだステージングされていないファイルを追加しようとする。 – Darien

+0

+1!しかし、これはgitのルートディレクトリでのみ動作し、代わりに 'git status -s'を使用すると、どのディレクトリでも動作します。 – pktangyue

0

ファイル名にスペースが含まれている場合は受け入れ答えは動作しません。また、-uは役に立たないが、Changed but not updatedChanges to be committedの両方のファイルが存在しない場合は、すべてのステージングされていないファイルを追加する。これを代わりに使用してください:

これは、変更されたファイルに対してのみ機能します。あなたは、これが削除されたファイルのために仕事をしたい場合は、名前を変更したりもコピー、追加、これを使用します。

git add $(git status -z | perl -0ne 'print $1 if $_ =~ /^[MADRC][MD](.*)$/') 

をしかし、最後の1に注意してください。たとえば、ファイルがindexに追加されていてもその削除がステージングされていない場合、このコマンドを実行するとインデックス内のファイルも削除され、そのファイルの内容が失われます。

git repoのルートディレクトリからのみ動作することに注意してください。

関連する問題