16

一意のファイル名であるが、前に長いパスがあるファイルを追加したい(例:a / b / c / d / filename.java)。通常、これをリポジトリに追加するには、

git add *filename.java

しかし、私も以前にこれを行いました:

git add a/b/c/d/filename*

だから私は2つを組み合わせようとしました:

git add *filename*

しかし、これは奇妙なことをします。追跡されていないすべてのファイルを追加します。失敗の考えられる理由はわかりますが、これらはすべて前の2つのコマンドのいずれかで発生するはずなので、なぜこれが発生しているのかわかりません。

私の質問は、ファイル名だけでgitリポジトリにファイルを追加する方法についてはそれほど重要ではありません(それは便利ですが)。*私の質問は、上記がうまくいくはずだと私に思わせる操作についての私の誤解は何ですか?

情報:

minGWをベースにしたGitBashforWindowsを使用しています。

4

2 に答える 2

20

あなたはグロブ (異なるパターンマッチング言語である正規表現ではない)を見ています、そしてそれらはgitではなくあなたのシェルによって拡張されます。

それらがどのように一致するかを確認したい場合は、同じグロブを別のコマンドに渡すだけです。

$ ls -d *filename.java

vs

$ ls -d *filename*

(追加したばかり-dなので、一致するディレクトリの内容は表示されません)


git bashを使用していて、glob拡張が通常のシェルとは異なる動作をする可能性があるため、試してみてください

$ git add --dry-run --verbose -- *filename*

例:これは、それが実際にグロブをどのように拡張するか、そしてそれがどのような効果をもたらすかを示すはずです。

--...ファイル名を先頭と一致する可能性-のあるグロブを使用している場合は、それがオプションではなくファイル名であることをgitが認識していることを確認することが重要です。

残念ながら、これは両方ともglobに一致し、インデックスと作業コピーの間にいくつかの違いがあるファイルのみを表示します。


著者から の回答:ドライランは大いに役立ちました、これが私が見つけたものです:

追加していないbinフォルダーを忘れていたので、ドライランを実行したときに、filename.javaとfilename.classの2つの一致が見つかっていることに気付きました。グロブを変更する*filename.j*と機能しました。

次のステップは、.classを削除して、コマンドを再試行することでした。機能しました。2つの一致が見つかったときにgitbashがすべてを追加した理由はまだ説明されていません...ドライランは実際の実行とは異なる動作をするため、バグがあるはずですが、他の場所で議論する必要があると思います(誰かが考えない限り)バグではありません)。

于 2012-08-15T11:51:47.267 に答える
1

あなたはで試すことができますgit add ./**/*.java

注:zshでテストしましたが、bashでも機能するはずです。

于 2020-10-07T17:18:38.000 に答える