0
votes

Commande simple pour mettre en scène tous les fichiers qui ont été renommés sans modifications

Lorsque je renomme un dossier entier ou que je refactore, je pense que c'est une bonne pratique d'isoler l'opération de changement de nom sur son propre commit séparé. Si je le mélange avec d'autres modifications en attente, je ne ferai que compliquer la vérification du commit. Ainsi, le commit ne devrait avoir que des opérations de changement de nom de chemin sans autres modifications, sauf lorsqu'elles sont renommées des références inhérentes à l'opération de refactoring (mais je les organiserais manuellement).

Existe-t-il une simple commande git (ou un script / une fonction shell que je pourrais ajouter à ~ / .bash_aliases) que je peux utiliser pour mettre en scène tous les fichiers qui ont été renommés sans autres modifications, et uniquement celles-ci?

Pour plus de simplicité, vous pouvez supposer que rien d'autre n'est mis en scène, vous pouvez donc en faire 2 étapes comme:

  1. mettre en scène tous les fichiers
  2. désinstaller tous les fichiers qui ont des modifications autres que le simple changement de nom de chemin

Comment pourrais-je faire ça?


0 commentaires

3 Réponses :


1
votes

git status --porcelain=v2 distinction entre les changements normaux et les renommages / copies.
Vous pouvez ajouter ceci à bash_aliases:

function gitStageRenamed() {
  git add -A &&
  git status --find-renames=100% --porcelain=v2 |
  grep ^1 | cut -d' ' -f 9- | xargs -rd'\n' git reset
}

Cela prend toutes les modifications normales (lignes commençant par 1 ), récupère les chemins et les transmet à git reset .

Si vous n'utilisez pas GNU xargs (Mac), débarrassez-vous du -rd'\n' , bien qu'il ne soit pas aussi robuste (ne gérera pas les noms de fichiers avec des espaces et peut exécuter git reset même s'il n'y a que des renoms).


1 commentaires

Votre réponse a fonctionné pour moi après avoir ajouté --find-renames=100% de l'autre réponse. Sans cela, il met également en scène les changements de noms avec des modifications (également un cas d'utilisation valide, mais pas ce que je préfère, car je veux vérifier ces modifications et les mettre en scène manuellement). Voir ma modification et je marquerai votre réponse comme acceptée. Merci!



1
votes

git status --find-renames=100% --porcelain marquera un "renommé" uniquement des renoms purs.

Voici un script pour utiliser ceci:

#!/bin/bash

git add -A
git status --find-renames=100% --porcelain | grep -v "^R " | cut -c 4- | xargs git reset


3 commentaires

cut ne renvoie qu'une lettre pour chaque ligne. Cependant, l'ajout de --find-renames=100% de votre réponse à l'autre réponse a fonctionné, alors merci.


Notez que la possibilité de fournir --find-renames=<value> à git status est quelque peu nouvelle (apparue pour la première fois dans Git 2.18; beaucoup de distributions utilisaient des versions plus anciennes de Git).


@geekly: en effet, il faut cut -c4- (avec un "tiret" supplémentaire, pour dire "de la 4ème position à la fin")



2
votes

Une manière plus propre:

git add .
( IFS=$'\n'
  git reset $(git diff-index -M  --find-renames=100% --diff-filter=r --name-only @)
)


0 commentaires