53 votes

Y a-t-il un 'git sed' ou équivalent?

Disons que je veux renommer une méthode dans le code source contenu dans un dépôt git. Je pourrais le faire à la main, mais le nom de la méthode peut être à plusieurs endroits (par exemple, les tests unitaires, documentation, méthode). Pour vérifier si la méthode est utilisée, j'utilise git grep'. J'obtiens 'git grep' pour afficher uniquement les lignes que je veux changer, et puis je n'ai pas de flux de travail pour changer automatiquement de ces lignes.

Je suis à la recherche d'un moyen automatisé (espérons-le à l'aide de git outils) pour faire de cette dernière étape. J'espérais qu'il y avait une sorte de git " sed " ou équivalent, mais je ne peux pas en trouver.

L'interface je pense serait bien: git sed 's/vieux-méthode-nom/nouveau-méthode-nom/g'

63voto

Greg Hewgill Points 356191

Vous pouvez utiliser git ls-files en combinaison avec xargs et sed :

 git ls-files | xargs sed -i -e 's/old-method-name/new-method-name/g'
 

25voto

Clayton Stanley Points 2211

Merci à Noufal et Greg pour leurs messages. J'ai combiné leurs solutions et trouvé une solution utilisant git grep (plus robuste que git ls-files pour mon référentiel, car elle semble ne répertorier que les fichiers contenant le code src réel - pas les dossiers de sous-modules par exemple), et a également l'ancien nom de méthode et le nouveau nom de méthode à un seul endroit:

Dans le bloc [alias] de mon fichier ~/.gitconfig :

 sed = ! git grep -z --full-name -l '.' | xargs -0 sed -i -e
 

Utiliser:

 git sed 's/old-method-name/new-method-name/ig'
 

14voto

Noufal Ibrahim Points 32200

Tu pourrais faire un

 for i in $(git grep --full-name -l old_method_name)
do
 perl -p -i -e 's/old_method_name/new_method_name/g' $i
done
 

collez-le quelque part dans un fichier, puis aliasez-le sous la forme git sed dans votre configuration.

Mise à jour: Le commentaire de tchrist ci-dessous est une bien meilleure solution car il empêche le perl de se reproduire à plusieurs reprises.

9voto

Mr Fooz Points 21092

Voici une solution qui combine celles de Noufal et claytontstanley et évite de toucher les fichiers qui ne changeront pas.

Dans le bloc [alias] de mon fichier ~/.gitconfig :

 psed = !sh -c 'git grep --null --full-name --name-only --perl-regexp -e \"$1\" | xargs -0 perl -i -p -e \"s/$1/$2/g\"' -
 

Utiliser:

 git psed old_method_name new_method_name
 

1voto

VonC Points 414372

Noter qu'à partir de git 2.1 (T3 2014), vous pouvez régler "full-name" par défaut pour git grep.
(Voir commettre 6453f7b par Andreas Schwab)

"git grep" appris grep.fullname variable de configuration à la force "--full-name" par défaut.
Cela peut entraîner des régressions sur le script d'utilisateurs qui ne s'attendent pas à ce nouveau comportement.

Cela signifie que les solutions précédentes peuvent bénéficier de:

git config grep.full-name true

Et l'utilisation:

psed = !sh -c 'git grep --null --name-only --perl-regexp -e \"$1\" | xargs -0 perl -i -p -e \"s/$1/$2/g\"' -

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X