web-dev-qa-db-fra.com

git add * (astérisque) vs git add. (période)

Je suis nouveau sur git et j'ai une question sur l'ajout de fichiers dans git. J'ai trouvé plusieurs questions sur la différence entre git add . et git add -a, git add --all, git add -A, etc. Mais je suis incapable de trouver un endroit qui explique quoi git add * Est-ce que. J'ai même regardé le page de manuel de git add , mais cela n'a pas aidé. Je l'utilise à la place de git add . et mon collègue m'a demandé pourquoi. Je n'ai pas eu de réponse. Je viens de toujours utiliser git add *.

Sont git add . et git add * le même? Est-ce que l'un ajoute des fichiers modifiés à partir du répertoire actuel uniquement, tandis que l'autre ajoute des fichiers à partir du répertoire actuel et des sous-répertoires (de manière récursive)?

Un grand tableau répertorié sur l'une des autres questions de la pile montre la différence entre git add -Agit add . et git add -u, mais il n'a pas git add *.

enter image description here

Remarque: je comprends ce que signifie utiliser l'astérisque comme caractère générique (ajouter tous les fichiers avec une extension donnée). Par exemple, git add *.html ajouterait tous les fichiers qui ont un .html extension (mais ignorez .css, .js, etc).

Merci pour l'aide!

107
Tyler Youngblood

add * signifie que tous les fichiers du répertoire en cours sont ajoutés, à l’exception des fichiers dont le nom commence par un point. Ceci est la fonctionnalité de votre shell et Git ne reçoit jamais qu'une liste de fichiers.

add . n'a pas de signification particulière dans votre shell et Git ajoute donc le répertoire entier de manière récursive, ce qui est presque identique, mais en incluant les fichiers dont le nom commence par un point.

102
Denis

* ne fait pas partie de git - c'est un caractère générique interprété par le shell. * s'étend à tous les fichiers du répertoire courant et est ensuite transmis à git, qui adds tous. . est le répertoire en cours et git adding il va l'ajouter et tous les fichiers qu'il contient.

23
Mureinik

L'utilisation du point . Dans le shell signifie généralement "le répertoire actuel".

Lorsque vous utilisez l'astérisque * Sur un shell, une fonctionnalité appelée file-globbing Est utilisée. Par exemple. sur Bash la fonction glob() fait exactement cela. La page de manuel de glob (man 7 glob) Indique:

[~ # ~] description [~ # ~]

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.

Correspondance générique

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

Globbing

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

Cela signifie que lorsque vous transmettez des arguments à n’importe quel programme de la ligne de commande contenant '?', '*' Ou '[', Le premier déplacement étend le motif générique dans une liste de fichiers, puis les donne à fichiers comme argument du programme lui-même.

La différence de sens entre 'git add .' Et 'git add *' Est clairement décrite par Denis :

git add S'attend à une liste de fichiers à ajouter. Dans l'exemple ci-dessus, le shell développe * Ou . Respectivement et donne le résultat en tant que paramètre à ajouter. Maintenant, la différence est que, avec git add ., Git se développera dans le répertoire actuel, tandis que git add * Déclenchera la suppression de fichier et l’élargira à tous les fichiers et répertoires qui ne commencent pas par un point.

6
codingdave

Pour plus de clarté, je mets la réponse dans le tableau ci-dessous:

enter image description here

Notes complémentaires (inspirées du commentaire @ reka18):

Remarque 1. Les commandes git add -A Et git add -u Exécutées sans paramètres supplémentaires constitueraient un raffinement supplémentaire (indication de sous-répertoire ou de masque pour nom de fichier) fonctionne dans la plage de l’ensemble du répertoire de travail (même si nous exécutons la commande dans le sous-répertoire de travail du répertoire).

Note 2. Le . Et le * Sont respectivement le chemin du répertoire (répertoire actuel) et le caractère générique, qui clarifient le chemin de la commande. Par exemple, si la commande git add . Ou git add * Est exécutée dans un sous-répertoire d'un répertoire de travail, son action n'est utilisée que dans ce sous-répertoire et non dans le répertoire de travail complet.

Remarque 3. Les commandes git add -A Et git add -u Peuvent être affinées en ajoutant un chemin ou un masque pour les fichiers, pour Par exemple, git add -A app/controllers ou git add -u app\styles\*.

5
simhumileco