web-dev-qa-db-ja.com

新しいファイルをステージングせずにgitで追加するにはどうすればよいですか?

Gitを効果的に(そして意図したとおりに)使用するために、小さなアトミックコミットを作成しますが、変更するセッションは1つだけではありません。したがって、私はgit add -pを多用しています。ただし、後で忘れてしまう傾向があるため、これは完全に新しいファイルに対しては機能しません。

私がやりたいことは、gitis新しいファイル、追跡したいがステージングしないであることを伝えます。

例:git statusを実行すると、以下が生成されます。

# On branch my-current-branch
# Your branch is ahead of 'Origin/my-current-branch' by 2 commits.
#
# Changes to be committed:
#
<<STAGED SECTION>> // A
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
<<UNSTAGED-YET-KNOWN SECTION>> // B
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
<<UNKNOWN SECTION>> // C

Cセクションにファイルfooがあり、git add fooと言うと、Aセクションに移動します。 git add -N fooと言うと、AとBの両方に行きます。しかし、それは、少なくとも新しいファイルがあるという事実として、次のコミットに含まれることを意味します。

それをセクションBだけに入れて、後でgit add -pまたはgit add foo(または何でも)を使用してAに追加できるようにします。

編集する

add -Nソリューションに関しては、これは機能しません。add -Nと言った後にコミットしようとすると、-notが適切に追加した場合、gitはそれを知らないため、文句を言います。空のファイルを処理する方法:

foo: not added yet
error: Error building trees
47
bitmask

Git 2.5では、git add -N/--intent-to-addが実際に適切なソリューションです。
新しいファイルは次のコミットの一部にはなりません。

NguyễnTháiNgọcDuyによる commit d95d728 を参照してください( pclouds )( d0c69226 にマージ):

diff-lib.c:diffのi-t-aエントリの位置を調整します

問題:

git add -N」によって追加されたエントリは、コミットする前に追加することを忘れないように、ユーザーに通知します。これらのエントリは、実際にはなくてもインデックスに表示されます。インデックスにそれらが存在すると、次のように "git status"が混乱します。

On branch master
Changes to be committed:
        new file:   foo

Changes not staged for commit:
        modified:   foo

git commit」を実行すると、「foo」が「to be committed」と報告しても、「status」は含まれません。

解決:

このパッチは出力を次のように変更します

On branch master
Changes not staged for commit:
        new file:   foo

no changes added to commit

つまり:

このようなパスは「まだインデックスに追加されていませんが、Gitはそれらについてすでに知っています」のように扱います。 「git diff HEAD」と「git diff --cached HEAD」はそれらについて話すべきではなく、「git diff」はそれらを新しいものとして表示する必要があります。 +まだインデックスに追加されていないファイル。

25
VonC

おそらく、追跡されていないファイルがある場合に警告する、事前コミットフックを作成してみてください。ただし、これを行うにはgitディレクトリを常にクリーンな状態に保つ必要があります(もちろん、最新の.gitignoreを維持する必要があります)。

また、git add -iと似ていますが、新しいファイルを追加するためのインターフェースも備えたgit add -pを試してください。

3
asmeurer

変更を加える前に、そのパスを持つ空のファイルをコミットできます。すでにそこに物事を書き込んでいる場合は、ファイルを移動して空のファイルを作成し、それをコミットしてから、通常どおり-pを追加し、git commit --amendしたがって、「空のファイルを追加」するコミットはありません。

1
Daenyth