問題の両方の例は、データ損失につながる可能性がある実際には非常に悪い例です!
私のアドバイス:/*
正当な理由がない限り、.gitignoreファイルのディレクトリには決して追加しないでください!
たとえば、Jefromiが「後でディレクトリ内の何かを無視しないようにするつもりの場合」と書いたのは、もっともな理由です。
それ以外の場合に行われるべきではない理由は、/*
ディレクトリに追加すると、一方ではディレクトリのすべてのコンテンツが適切に無視されるように機能しますが、一方では危険な副作用があるためです。
あなたが実行した場合はgit stash -u
(一時的に追跡し、人跡未踏のstashファイルに)またはgit clean -df
(人跡未踏削除するのではなく、無視されたファイルを保持する)リポジトリに、追加で無視されているすべてのディレクトリが/*
される不可逆的に削除されました!
いくつかの背景
私はこれを難しい方法で学ばなければなりませんでした。私のチームの誰かが私/*
たちの.gitignoreのいくつかのディレクトリに追加していた。時間の経過とともに、特定のディレクトリが突然消えてしまうことがありました。アプリケーションが必要とするギガバイトのローカルデータを含むディレクトリ。誰もそれを説明することはできなかったし、私はいつもすべてのデータを再ダウンロードしたいと思っている。しばらくすると、それはに関係しているのではないかと思いましたgit stash
。ある日、(無視されたファイルを保持しながら)ローカルリポジトリをクリーンアップしたいと思っていましたが、使用git clean -df
していて、データが失われました。今回は十分に問題を調査しました。ついにその理由が追記されたと思いました/*
。
私はそれがdirectory/*
ディレクトリ自体ではなくディレクトリのすべてのコンテンツを無視するという事実によって何とか説明できると思います。したがって、物事が削除されても、追跡されたり、無視されたりすることはありません。とはいえgit status
、git status --ignored
その上で少し異なる画像を与えます。
再現する方法
これが動作を再現する方法です。現在Git 2.8.4を使用しています。
ディレクトリlocaldata/
その中にダミーファイル(とはimportant.dat
)地元のgitリポジトリに作成され、内容は置くことによって無視されます/localdata/*
に.gitignore
ファイル。上記の2つのgitコマンドのいずれかを実行すると、ディレクトリが(予期せず)失われます。
mkdir test
cd test
git init
echo "/localdata/*" >.gitignore
git add .gitignore
git commit -m "Add .gitignore."
mkdir localdata
echo "Important data" >localdata/important.dat
touch untracked-file
git status --ignored
ここを実行すると、次の結果が得られます。
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
untracked-file
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
localdata/
今どちらか
git stash -u
git stash pop
または
git clean -df
どちらの場合も、無視されたとされるディレクトリlocaldata
は削除されます。
これがバグと考えられるかどうかはわかりませんが、少なくとも誰も必要としない機能だと思います。
私はそれをgit開発リストに報告し、彼らがそれについてどう思うか見てみましょう。
.gitignore
それは無視するファイルとディレクトリを区別しますか?たとえば、data
vsdata/
は別の意味ですか?