web-dev-qa-db-ja.com

git add *(アスタリスク)vs git add。 (期間)

私はgitが初めてなので、gitにファイルを追加することについて質問があります。 git add .git add -agit add --allgit add -Aなどの違いに関する複数のstackoverflowの質問を見つけました。しかし、私はgit add *します。 git add man page も見ましたが、助けにはなりませんでした。私はgit add .の代わりにそれを使用していましたが、同僚が私に理由を尋ねました。答えがありませんでした。私はいつもgit add *を使ってきました。

git add .git add *は同じですか? 1つは現在のディレクトリからのみ変更されたファイルを追加し、もう1つは現在のディレクトリとサブディレクトリからファイルを(再帰的に)追加しますか?

git add -Agit add .git add -uの違いを示す他のスタックの質問の1つに素晴らしいチャートがリストされていますが、git add *はありません。

enter image description here

注:アスタリスクをワイルドカードとして使用することの意味を理解しています(特定の拡張子を持つすべてのファイルを追加します)。たとえば、git add *.htmlは、.html拡張子を持つすべてのファイルを追加します(ただし、.css.jsなどは無視します)。

助けてくれてありがとう!

107

add *は、名前がドットで始まるファイルを除き、現在のディレクトリにすべてのファイルを追加することを意味します。これがシェル機能であり、Gitはファイルのリストのみを受け取ります。

add .はシェルでは特別な意味を持たないため、Gitはディレクトリ全体を再帰的に追加します。これはほぼ同じですが、名前がドットで始まるファイルを含みます。

102
Denis

*はgitの一部ではありません-シェルによって解釈されるワイルドカードです。 *は現在のディレクトリ内のすべてのファイルに展開され、その後gitに渡されます。これはすべてaddsです。 .は現在のディレクトリそのものであり、git addingすると、そのディレクトリとその下のすべてのファイルが追加されます。

23
Mureinik

シェルでドット.を使用することは、通常「現在のディレクトリ」を意味します。

シェルでアスタリスク*を使用する場合、file-globbingという機能が利用されます。例えば。 bashでは、関数glob()はまさにそれを行っています。グロブのマンページ(man 7 glob)の状態:

説明

Long ago, in UNIX V6, there was a program /etc/glob that would expand 
wildcard patterns.  Soon afterward this became a Shell built-in.
These days there is also a library routine glob(3) that will perform this 
function for a user program.

ワイルドカードマッチング

A string is a wildcard pattern  if it contains one of the characters '?', '*' or '['. 

グロビング

Globbing is the operation that expands a wildcard pattern 
into the list of pathnames matching the pattern.

つまり、コマンドラインで'?''*'、または'['を含むプログラムに引数を渡すと、最初のグロビングはワイルドカードパターンをファイルのリストに展開し、これらのファイルを引数として提供しますプログラム自体に。

'git add .''git add *'の意味の違いは、 Denis によって明確に説明されています。

git addは、ファイルのリストが追加されることを期待しています。上記の例では、シェルは*または.をそれぞれ展開し、結果をパラメーターとしてgit addに提供します。現在の違いは、git add . gitを使用すると現在のディレクトリに展開されるのに対して、git add *はファイルのグロビングをトリガーし、ドットで始まらないすべてのファイルとディレクトリに展開することです。

6
codingdave

わかりやすくするために、次の表に答えを示します。

enter image description here

追加メモ(@ reka18コメントに触発):

注1。git add -Aおよびgit add -uコマンドを追加パラメーターなしで実行すると、さらに細かくなります(ファイル名のサブディレクトリまたはマスク表示)作業ディレクトリ全体の範囲で作業する(ディレクトリの作業サブディレクトリでコマンドを実行する場合も)。

注2。.および*は、それぞれディレクトリパス(現在のディレクトリ)およびワイルドカードであり、パスを明確にします。コマンドの。たとえば、git add .またはgit add *コマンドが作業ディレクトリのサブディレクトリで実行される場合、それらのアクションは作業ディレクトリ全体ではなく、このサブディレクトリ内でのみ使用されます。

注3。git add -Aおよびgit add -uコマンドは、たとえば、ファイルのパスまたはマスクを追加することでさらに絞り込むことができます。 git add -A app/controllersまたはgit add -u app\styles\*

5
simhumileco