103 votes

Peut-on un crochet Git ajouter automatiquement des fichiers au commit ?

Je voudrais ajouter un fichier généré automatiquement au même commit en utilisant un crochet pre- ou post-commit dans Git, en fonction des fichiers qui ont été modifiés dans ce commit. Comment puis-je procéder?

J'ai essayé cela en tant que crochet pre-commit, mais sans succès :

#!/bin/sh
files=`git diff --cached --name-status`
re=""
if [[ $files =~ $re ]]
then
  echo "Création des fichiers"
  exec bundle exec create_my_files
  exec git add my_files
  exec git commit --amend -C HEAD
fi

Cela les ajoute avec succès au dépôt, mais ne les ajoute pas au commit. J'ai également essayé d'utiliser les deux dernières lignes exec dans un crochet post-commit avec l'inspection pre-commit, mais ça non plus.

74voto

bitluck Points 61

Étant donné que git add ne fonctionnait pas non plus pour moi dans un précommit, j'ai suivi l'idée de Mark d'utiliser un fichier .commit et de diviser le processus en pre- et post-commit.

Voici un peu de code qui devrait être facile à comprendre

Dans le pre-commit :

  • Créez un fichier .commit ou quelque chose du genre. (assurez-vous de l'ajouter à .gitignore)
#!/bin/sh 
echo 
touch .commit 
exit

Dans le post-commit :

si .commit existe, vous savez qu'un commit vient d'avoir lieu mais qu'un post-commit n'a pas encore été exécuté. Ainsi, vous pouvez générer votre code ici. En outre, testez .commit et s'il existe :

  • ajoutez les fichiers
  • commit --amend -C HEAD --no-verify (évitez les boucles)
  • supprimez le fichier .commit
#!/bin/sh
echo
if [ -e .commit ]
    then
    rm .commit
    git add votreFichier
    git commit --amend -C HEAD --no-verify
fi
exit

J'espère que cela rendra plus facile pour les personnes ayant peu de connaissances en bash de suivre l'idée de Mark.

40voto

Jim Garvin Points 3318

Il est possible de faire ce que vous voulez en utilisant des crochets pre-commit. Nous faisons quelque chose de similaire pour un déploiement heroku (compilation de coffeescript en javascript). La raison pour laquelle votre script ne fonctionne pas est que vous avez mal utilisé la commande exec.

De la page man man page:

La commande exec intégrée est utilisée pour remplacer l'image du processus en cours d'exécution du shell par une nouvelle commande. En cas de réussite, exec ne renvoie jamais. exec ne peut pas être utilisé à l'intérieur d'un pipeline.

Seule votre première commande exec s'exécute. Ensuite, votre script est essentiellement terminé.

Essayez quelque chose comme ceci (en tant que crochet pre-commit):

#!/bin/sh
files=`git diff --cached --name-status`
re=""
if [[ $files =~ $re ]]
then
  echo "Création de fichiers"
  bundle exec create_my_files
  git add my_files
fi

17voto

jaydee3 Points 6967
#!/bin/sh
#
#  .git/hooks/pre-commit
#

git add file.xyz

Cela a très bien fonctionné pour moi. Cela fera partie du commit actuel.

git version 1.7.12.4 (Apple Git-37)

13voto

Mark Points 13

Vous pourriez utiliser une combinaison d'un script pre et post commit.

Dans le pre-commit :

  • Créez un fichier .commit ou quelque chose. (n'oubliez pas de l'ajouter à .gitignore)

Dans le post-commit :

si .commit existe, vous savez qu'un commit vient d'avoir lieu mais qu'un post-commit n'a pas encore été exécuté. Ainsi, vous pouvez générer votre code ici. En outre, vérifiez si .commit existe :

  • ajoutez les fichiers
  • commit --amend -C HEAD --no-verify (pour éviter une boucle)
  • supprimez le fichier .commit

C'est à peu près le processus que j'utilise pour stocker un fichier .metadata dans le dépôt généré par le métastore.

Si quelqu'un connaît une meilleure façon, je suis tout ouïe, mais cela semble fonctionner pour le moment.

12voto

rfunduk Points 15267

Vous pouvez utiliser update-index :

git update-index --add mes_fichiers

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