私は足をgitで濡らしていて次のような問題があります
私のプロジェクトのソースツリー:
/
|
+--src/
+----refs/
+----...
|
+--vendor/
+----...
私は自分のベンダーブランチにコード(現在はMEF)があり、そこでコンパイルしてから参照を/src/refs
に移動します。ここでプロジェクトがそれらを拾います。
私の問題は、.gitignore
を*.dll
と*.pdb
を無視するように設定していることです。無視されたファイルを強制的に追加するためにgit add -f bar.dll
を実行することができます。問題は、無視されているファイルをリストすることができないことです。
私はそれらを追加することを忘れないようにするために無視されたファイルをリストしたいです。
私はgit ls-files
のmanページを読みましたが、動かせません。 git ls-files --exclude-standard -i
が私が望むことをするべきだと私には思えます。何が足りないの?
ノート:
git status --ignored
.gitignore
ファイルの影響を無視するようにgit-statusに指示する方法はありますか? "に説明があります)git clean -ndX
無視されたファイルのプレビューを表示して、古いgitsで動作します(何も削除せずに)削除することができますまた興味深い( qwertymk s answer に記載)、 git check-ignore -v
コマンドも使えます。少なくともUnixでは( 動作しません CMDでは Windows セッション)
git check-ignore *
git check-ignore -v *
2番目のものはあなたのgitリポジトリで無視されるファイルを作る.gitignore
の実際のルールを表示します。
Unixでは、 " を使うとカレントディレクトリの全ファイルに再帰的に展開する? "とbash4 +:
git check-ignore **/*
(またはfind -exec
コマンド)
元の回答42009)
git ls-files -i
のソースコード 以外は動作するはずです。
if (show_ignored && !exc_given) {
fprintf(stderr, "%s: --ignored needs some exclude pattern\n",
argv[0]);
exc_given
?
実際に何かを一覧表示するには、-i
の後にもう1つパラメータが必要です。
試してください:
git ls-files -i --exclude-from=[Path_To_Your_Global].gitignore
(しかし、それはあなたのキャッシュされた(無視されない)オブジェクトをフィルタでリストアップするだけなので、それはあなたが望むことではありません)
例:
$ cat .git/ignore
# ignore objects and archives, anywhere in the tree.
*.[oa]
$ cat Documentation/.gitignore
# ignore generated html files,
*.html
# except foo.html which is maintained by hand
!foo.html
$ git ls-files --ignored \
--exclude='Documentation/*.[0-9]' \
--exclude-from=.git/ignore \
--exclude-per-directory=.gitignore
実際、私の 'gitignore'ファイル( 'exclude'と呼ばれています)には、あなたを助けることができるコマンドラインがあります。
F:\prog\git\test\.git\info>type exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
そう....
git ls-files --others --ignored --exclude-from=.git/info/exclude
git ls-files -o -i --exclude-from=.git/info/exclude
git ls-files --others --ignored --exclude-standard
git ls-files -o -i --exclude-standard
トリックをするべきです。
ls-filesのmanページ で述べたように、--others
は、キャッシュされていない、コミットされていない、通常は無視されるファイルを表示するための重要な部分です。
--exclude_standard
は単なるショートカットではありませんが、all standardの「無視パターン」設定を含める方法です。
exclude-standard
標準のgitの除外、各ディレクトリの.git/info/exclude
、.gitignore
、およびuser's global exclusion file
を追加します。
もっと簡単な方法があります(git 1.7.6以降):
git status --ignored
かなりきれいなもう一つのオプション(駄洒落は意図されていません):
git clean -ndX
説明:
$ git help clean
git-clean - Remove untracked files from the working tree
-n, --dry-run - Don't actually remove anything, just show what would be done.
-d - Remove untracked directories in addition to untracked files.
-X - Remove only files ignored by Git.
注:この解決方法では、既に削除されている無視されたファイルは表示されません。
一般的には正しいですが、あなたの解決策はすべての状況で動作するわけではありません。このようなレポジトリを仮定します。
# ls **/*
doc/index.html README.txt tmp/dir0/file0 tmp/file1 tmp/file2
doc:
index.html
tmp:
dir0 file1 file2
tmp/dir0:
file0
そしてこのような.gitignore:
# cat .gitignore
doc
tmp/*
これはdoc
ディレクトリとtmp
以下のすべてのファイルを無視します。 Gitは期待通りに動作しますが、無視されたファイルをリストするための与えられたコマンドは動作しません。 gitが何を言っているのか見てみましょう。
# git ls-files --others --ignored --exclude-standard
tmp/file1
tmp/file2
doc
がリストにないことに注意してください。あなたはそれを得ることができます:
# git ls-files --others --ignored --exclude-standard --directory
doc/
追加の--directory
オプションに注目してください。
私の知る限りでは、無視されるすべてのファイルを一度に一覧表示する1つのコマンドはありません。しかし、なぜtmp/dir0
がまったく表示されないのかわかりません。
Gitの複数のgitignoreソースのどこかにあるパターンにマッチするワーキングツリー内のファイルの完全なリストを印刷する方法は次のとおりです(GNU find
を使用している場合)。
$ cd {your project directory}
$ find . -path ./.git -Prune -o -print \
| git check-ignore --no-index --stdin --verbose
リポジトリの現在のブランチにあるすべてのファイルをチェックします(ローカルに削除した場合を除く)。
そしてそれは同様に特定のgitignoreソースラインを識別します。
Gitは、gitignoreパターンに一致するいくつかのファイルの変更を追跡し続けます。それらのファイルがすでに追加されているからです。便利なことに、上記のコマンドはそれらのファイルも表示します。
陰性のgitignoreパターンもまた一致します。ただし、これらは!
で始まるため、リスト内で簡単に区別できます。
Windowsを使用している場合、 Git Bash にはGNU find
が含まれます(find --version
で明らかにされています)。
リストが長い(そしてあなたがrev
を持っている)場合、それらを拡張子で(やや)表示することもできます。
$ cd {your project directory}
$ find . -path ./.git -Prune -o -print \
| git check-ignore --no-index --stdin --verbose \
| rev | sort | rev
詳しくは、man find
、man git-check-ignore
、man rev
、およびman sort
を参照してください。
このアプローチ全体のポイントは、Git(ソフトウェア)が急速に変化しており、非常に複雑であるということです。対照的に、GNUのfind
はextremestableです(少なくともここで使用されている機能において)。そのため、Gitについての深い知識を表示して競争力を高めたいという人は、別の方法で質問に答えます。
最良の答えは何ですか?Thisanswerは、モジュール性(情報の分離)を通じて安定性と単純さの目標を達成するために、意図的にGit知識への依存を最小限に抑え、longを持続するように設計されています時間。
(他の答えを拡張する)
git check-ignore
はコミット済みの.gitignore
を使用し、作業ツリーのものを使用しません。あなたのgit履歴を汚染することなくそれで遊ぶために、あなたはそれを自由に編集しようと試みるかもしれませんそしてそれからgit commit --amend
でコミットします。
この問題は主に、gitがディレクトリをたどらないという問題の回避策が必要な場合に発生します。 .gitignore
を入力してください。
dirtokeep/**
!dirtokeep/.keep
.keep
はdirtokeep
name__内の長さゼロのファイルでなければなりません。
その結果、dirtokeep
name__内のeverythingは無視され、はdirtokeep/.keep
を除いて、dirtokeep
name__も無視されます。クローン/チェックアウト時にディレクトリが作成されます。
無視ディレクトリがいくつかあると仮定して、追加するファイルを教えてくれる「git status node/logs /」を使用しないでください。ディレクトリに、ステータス出力の一部ではないテキストファイルがあります。
支店主
あなたのブランチは 'Origin/master'で最新の状態になっています。
未追跡ファイル:
(コミットする内容に含めるには "git add ..."を使用してください)
node/logs/.gitignore
.gitignoreは次のとおりです。
*
!. gitignore