Je veux append uniquement des fichiers modifiés. J’ai essayé:
git status | grep "modified" | cut -d " " -f4 | git add
ou
git status | grep "modified" | cut -d " " -f4 | xargs git add
mais ça ne marche pas. Que dois-je utiliser?
Le premier ne fonctionnera pas car vous n’utilisez pas xargs
. La seconde ne fonctionne pas car la cut
ne fonctionne pas – regardez la sortie.
Il y a la commande git ls-files --modified
qui vous donne une liste de fichiers modifiés, un par ligne. Si vous n’avez pas d’espaces dans vos noms de fichiers, utilisez simplement:
git ls-files --modified | xargs git add
Si vous avez des espaces dans vos noms de fichiers, utilisez les options -z
et -0
(en vous assurant que votre variante de xargs
supporte l’option -0
, elle n’est pas universelle, mais est standard avec GNU xargs
):
git ls-files --modified -z | xargs -0 git add
git status
utilisez git status
sans indicateur, vous devez être certain qu’il n’ya pas d’espace dans vos noms de fichiers et que vous pouvez ensuite utiliser:
git status | awk '/[[:space:]]modified:[[:space:]]/{print $2}' | xargs git add
De plus, git status -s
donne un meilleur format de sortie, plus facilement analysable. Vous pourriez utiliser:
git status -s | sed -n '/^ M / s///p' | xargs git add
Cela fonctionne pour le cas simple (vous avez modifié le fichier localement, il n’est pas encore dans l’index, et c’est le seul changement pertinent). Vous devriez lire le spiel de git status --help
sur le format court pour savoir comment gérer les (nombreux) autres cas.
Notez également que git commit -a
va valider tous les fichiers modifiés.
J’essaie:
git ls-files -o | grep "tests/" | xargs -0 git add
git ls-files -o | grep "tests/" | xargs -0 git add
git ls-files -o | grep "tests/" | xargs -0 git add
, mais j’obtiens laxargs: argument line too long
.
L’option -0
de xargs
nécessite des ‘lignes’ se terminant par des octets nuls. Votre commande git
ne les génère pas car vous avez omis l’option -z
. Vous avez probablement omis cela parce que vous êtes inquiet au sujet du grep
au milieu (qui ne fonctionnera qu’avec des lignes se terminant par des nouvelles lignes), mais votre ligne de commande doit être cohérente de bout en bout, soit avec newlines ou null. délimiteurs de noms de fichiers. Heureusement, grep
a une option --null
(fonctionne sur GNU et BSD grep
; GNU permet également d’utiliser -z
, mais cela signifie quelque chose de différent sur BSD) pour travailler avec de telles données. Par conséquent, vous devriez essayer soit:
git ls-files -o -z | grep --null "tests/" | xargs -0 git add
ou, si vous n’avez pas à vous soucier des espaces dans les noms de fichiers:
git ls-files -o | grep "tests/" | xargs git add
Vous pouvez simplement utiliser git add -u
. Il ne mettra en scène que des fichiers modifiés .