単一のファイルを除くすべてのファイルをコミットに追加しますか?


571

チェンジセットにたくさんのファイルがありますが、変更された単一のファイルを特に無視します。次のようになりますgit status

# modified:   main/dontcheckmein.txt
# deleted:    main/plzcheckmein.c
# deleted:    main/plzcheckmein2.c
...

私ができる方法はありますgit addが、触れたくない1つのテキストファイルを無視しますか?何かのようなもの:

git add -u -except main/dontcheckmein.txt

回答:


851
git add -u
git reset -- main/dontcheckmein.txt

28
フォルダ全体を除外するにはどうすればよいですか?-mainまたはmain /またはmain / *?
アランCoromano 2013年

8
@MariusKavanskyこれらのフォームはすべて使用できます。使用main/*する場合--、それがパスであることをgitに知らせるために、その前に追加する必要があります。他の2つのバリアントは、2つのダッシュを含めなくても機能します。(msysGitを搭載したWindows 7のコマンドプロンプトでテスト済み)
dennisschagt 2014年

2
除外したいフォルダーの中に、大量のファイルや他のフォルダーが含まれている場合は、一時的にそれらをgitignoreに追加してください。git resetその後、これらのフォルダーに対してを実行しても機能しますが、大きなフォルダーを追加するにはgitに長い時間がかかります。
Michael Trouw

2
だから、ワンライナーはありませんか?
BroVic 2018

5
@ベンジャクソンは、各行にコメントするのがいいでしょうね。
ed1nh0 2018

140

1)バージョン管理済みの単一ファイルへの変更を無視し始めるには

git update-index --assume-unchanged "main/dontcheckmein.txt"

それを元に戻すには git update-index --no-assume-unchanged "main/dontcheckmein.txt"

ファイルを無視するgithub docs

2)特定の単一ファイルを完全に無視して、リポジトリで作成されないようにする

まず、このstackoverflowの投稿を見てください:Gitグローバル無視が機能していません

.gitignore、先頭に行かないでファイルへの相対パスを追加します./

したがって、ファイルがにあるMyProject/MyFolder/myfile.txt場合(.gitMyProjectフォルダーにもあります)、MyFolder/myfile.txtat .gitignoreファイルに追加します。

どのルールが無視に関連付けられているかを確認するには、 git check-ignore "MyFolder/myfile.txt"

グローバル無視について

そのリンクはについて語って~/.gitignore_globalいますが、ファイルはプロジェクトに関連しています。したがって、excludeパターンMyFolder/myfile.txt~/.gitignore_globalに配置すると、機能しますがあまり意味がありません...

一方、であれば、あなたのセットアッププロジェクトgit config core.excludesfile .gitignore場所.gitignoreにあるMyProjectローカルファイルは、上書きされます~/.gitignore_global持つことができ、非常に便利なルールを ...

だから、今のところ、私はそれはあなたを混合するために、いくつかのスクリプトを作成するのが最善だと思う.gitignore~/.gitignore_global.gitignore

最後の警告
無視したいファイルがすでにリポジトリにある場合、この方法を実行しない限りこのメソッドは機能しません。ただしgit rm "MyFolder/myfile.txt"、ローカルで削除されるため、最初にバックアップしてください!後でコピーできます...


5
を使用git rm --cached MyFolder/myyfile.txtして、ファイルをリポジトリから削除し、ローカルに保持できます。help.github.comの説明
dennisschagt

87

ファイルの場合

git add -u
git reset -- main/dontcheckmein.txt

フォルダの場合

git add -u
git reset -- main/*

9
なぜ-uが必要なのですか?なんでgit add . && git reset -- main/*

2
-uオプションは、<pathspec>に一致するエントリがすでにある場所でのみインデックスを更新します。これにより、作業ツリーと一致するようにインデックスエントリが削除および変更されますが、新しいファイルは追加されません。-uオプションを使用するときに<pathspec>を指定しないと、作業ツリー全体のすべての追跡ファイルが更新されます(更新を現在のディレクトリとそのサブディレクトリに制限するために使用されていた古いバージョンのGit)。
Farhad Mammadli

6
誰かがgit以外のプロが理解できる言語で-uが必要な理由を説明できますか?
Patrick

2
-uは、現在プッシュしているブランチを参照するために使用されます。git push origin master次のプッシュで入力する必要はなくなりgit push、gitはそれがマスターブランチにあることを認識します。それが役に立てば幸い。
Pepeng Hapon

69

gitサポートexclude certain paths and filesPATHSPEC魔法によって:(exclude)、その短縮形:!。したがって、次のコマンドで簡単に実現できます。

git add --all -- :!main/dontcheckmein.txt
git add -- . :!main/dontcheckmein.txt

実際にはさらに指定できます:

git add --all -- :!path/to/file1 :!path/to/file2 :!path/to/folder1/*
git add -- . :!path/to/file1 :!path/to/file2 :!path/to/folder1/*

1
最良の答え、ありがとう!少なくとも、私の場合は、ファイルの種類を除外するだけで済みました。
Andre Polykanine

15
これは素晴らしい!Linuxでは、:!...シェルが文句を言わないように句を引用する必要があることに注意してください。例えば、そう:git add --all -- ':!path/to/file1' ':!path/to/file2' ':!path/to/folder1/*'
Martin_W

のようなものはあり:!/path/to/(file1|file2)ますか?
seeker_of_bacon

これはzshの何かと衝突し、macOSと最新のgitでは動作しません。
マーリン

1
これが正式に文書化されている場所を誰かが指摘できますか?
samurai_jane

20

ベンジャクソンは正しいが、私はそのソリューションをどのように使用してきたかを追加したいと思った。以下は、私がgitaddと呼ぶ非常に単純なスクリプトで、すべての変更を追加します。.gittrackignore

#!/bin/bash
set -e

git add -A
git reset `cat .gittrackignore`

そして、これが私の現在の.gittrackignore様子です。

project.properties

デプロイ時にコマンドラインからコンパイルするAndroidプロジェクトに取り組んでいます。このプロジェクトはSherlockActionBarに依存しているため、project.propertiesで参照する必要がありますが、これはコンパイルに影響を与えるため、今度はgitaddすべての変更をgitに入力して追加するだけで、毎回project.propertiesを追加し直す必要はありません。


私は--あなたのコメントまで何があったのか知りませんでした。マニュアルページによると、そのオプションであり、コマンドの結果を変更しません(少なくともこの場合)。この質問は、stackoverflow.com / questions / 17800994 /…をサポートしているよう です。私が間違っている場合は修正してください。しかし--、「オプション/スイッチではなく、引数として何かを処理する」ことを意味しているようです
Anthony Naddeo

その質問--git checkout私はよく使用します。このダブルダッシュがどうなるかわからなかった。git checkoutブランチとファイルのあいまいさが、この形式または別の形式でgit resetも影響を与える可能性があるのでしょうか。
Giulio Piancastelli

10

ファイルの変更を保持するがコミットしないようにするために、私はこれを行いました

git add .

git reset -- main/dontcheckmein.txt

git commit -m "commit message"

ファイルが除外されていることを確認するには

git status


4

git add -Aすべての変更されたファイルと新しく追加されたファイルを一度に追加するために使用します。

git add -A
git reset -- main/dontcheckmein.txt



1

問題の特定のケースでは、最も簡単な方法は、拡張子が.cのすべてのファイルを追加し、それ以外はすべて除外することです。

git add *.c

以下からのgit-SCM(または/およびman git add):

git add <pathspec>…

コンテンツを追加するファイル。Fileglobs(たとえば、*。c)を指定して、一致するすべてのファイルを追加できます。<...>

これは、次のようなことも実行できることを意味することに注意してください。

git add **/main/*

mainフォルダ内にあるすべてのファイル(無視されない)を追加します。さらに手の込んだパターンを使用して、ワイルドにすることもできます。

git add **/s?c/*Service*

上記は、s(any char)cフォルダー内にありService、ファイル名のどこかにあるすべてのファイルを追加します。

明らかに、コマンドごとに1つのパターンに制限されていません。つまり、.cおよび.hの拡張子を持つすべてのファイルを追加するようにgitに要求できます。

git add *.c *.h

このリンクは、さらにいくつかのグロブパターンのアイデアを提供する可能性があります。

私は多くの変更を加えるときに特に便利ですが、それでも自分のコミットをアトミックに保ち、当時取り組んでいる可能性のある変更の寄せ集めではなく、段階的なプロセスを反映させたいと思っています。もちろん、ある時点で、複雑なパターンを作成するコストは、より簡単な方法でファイルを追加するコスト、または一度に1つのファイルを追加するコストを上回ります。ただし、ほとんどの場合、必要なファイルのみを単純なパターンで簡単に特定し、その他すべてを除外することは簡単にできます。

ちなみに、グロブパターンを機能させるには引用する必要があるかもしれませんが、これは私には当てはまりませんでした。


0

私はgit add --patchかなりの量を使用しdており、同じファイルから常にヒットする必要がないように、このようなものを望んでいました。私は仕事を終わらせるために非常にハッキーなgitエイリアスをいくつか作りました:

[alias]
    HELPER-CHANGED-FILTERED = "!f() { git status --porcelain | cut -c4- | ( [[ \"$1\" ]] && egrep -v \"$1\" || cat ); }; f"
    ap                      = "!git add --patch -- $(git HELPER-CHANGED-FILTERED 'min.(js|css)$' || echo 'THIS_FILE_PROBABLY_DOESNT_EXIST' )"

私の場合、特定の縮小されたファイルを常に無視したかっただけですが$GIT_EXCLUDE_PATTERN、より一般的な使用例のように、環境変数を使用するようにできます。



0

あなたはこれを試すことができます: git add * && git reset main/dontcheckmein.txt

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.