web-dev-qa-db-ja.com

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

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

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

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

git add -u -except main/dontcheckmein.txt
450
user291701
git add -u
git reset -- main/dontcheckmein.txt
694
Ben Jackson

1)すでにバージョン管理されている単一のファイルへの変更を無視し始める

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

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

ここで確認してください

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

これを最初に見て Git global ignore ignore -

そして.gitignoreで、./を先頭に付けずにファイルへの相対パスを追加します。

あなたのファイルがMyProject/MyFolder/myfile.txtにある場合(.gitMyProjectにある場合)、.gitignoreにあなたはこのMyFolder/myfile.txtを置く

git check-ignore "MyFolder/myfile.txt"を使用して、どのルールが無視に関連しているかを確認できます。

グローバル無視について

そのリンクは~/.gitignore_globalについて述べています。しかし、ファイルはあなたのプロジェクトに関連しています。そのため、除外パターンMyFolder/myfile.txt~/.gitignore_globalに置くと、うまくいきますが、あまり意味がありません...

一方、プロジェクトをgit config core.excludesfile .gitignoreで設定した場合、.gitignoreMyProjectになります。その設定は/を持つことができる~/.gitignore_globalをオーバーライドするでしょう - とても便利なルール ...

ですから、今のところ、.gitignore~/.gitignore_global.gitignoreを混在させるスクリプトを作成するのが最善だと思います。

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

112
Aquarius Power

ファイルの場合

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

フォルダの場合

git add -u
git reset -- main/*
60
Rituraj ratan

gitはpathspec magic :(exclude)とその短縮形exclude certain paths and filesによって:!をサポートするようになりました。それで、あなたは次のコマンドとしてそれを簡単に達成することができます。

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/*
25
cateyes

ベンジャクソンは正しいのですが、私は私がその解決策をどのように使ってきたかを追加すると思いました。以下は、.gittrackignoreというファイルにリストされている少数のものを除いて、すべての変更を追加するために使用する(gitaddと呼ぶ)非常に単純なスクリプトです(.gitignoreの動作と非常によく似ています)。

#!/bin/bash
set -e

git add -A
git reset `cat .gittrackignore`

これが私の現在の.gittrackignoreのようなものです。

project.properties

私はデプロイ時にコマンドラインからコンパイルするAndroidプロジェクトに取り組んでいます。このプロジェクトはSherlockActionBarに依存しているので、project.propertiesで参照する必要がありますが、コンパイルと混同されるので、今はgitaddと入力して、project.propertiesを一度に追加解除することなくすべての変更をgitに追加します。

19
Anthony Naddeo

これを試して:

gitチェックアウト - main/dontcheckmein.txt

4
Abz

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

git add .

git reset -- main/dontcheckmein.txt

git commit -m "commit message"

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

git status

2
gsumk

git add -Aを使用して、修正されたファイルと新しく追加されたファイルをすべて一度に追加します。

git add -A
git reset -- main/dontcheckmein.txt
2
Dhanuka Nuwan

コミットする変更:(ステージを解除するには "git reset HEAD ..."を使用します)

0
colin rickels

私は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
Chris

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

git add *.c

git-scm (または/およびman git add)から:

git add <pathspec>…

コンテンツを追加するファイル。ファイルグロブ(例:* .c)を指定すると、一致するすべてのファイルを追加できます。 <...>

これはあなたが以下のようなこともできることを意味することに注意してください。

git add **/main/*

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

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

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

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

git add *.c *.h

この link はもっとグロブパターンのアイデアをあなたに与えるかもしれません。

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

ちなみに、あなたはmayそれらが機能するためにあなたのglobパターンを引用符で囲む必要がありますが、これは私には当てはまりませんでした。

0
cegas