Peut un Git crochet automatiquement ajouter des fichiers à la livraison?
Je voudrais ajouter automatiquement un fichier généré à la même livraison à l'aide d'un pré - ou post-commit hook Git, dépendant sur les fichiers qui ont été modifiés dans ce commit. Comment pourrais-je aller à ce sujet?
J'ai essayé ce qu'un pre-commit hook, mais pas de chance:
#!/bin/sh
files=`git diff --cached --name-status`
re="<files of importance>"
if [[ $files =~ $re ]]
then
echo "Creating files"
exec bundle exec create_my_files
exec git add my_files
exec git commit --amend -C HEAD
fi
Avec succès, ajoute le dépôt, mais ne pas ajouter à la commettre. J'ai aussi essayé d'utiliser les deux dernières exec lignes dans un post-commit hook avec le pre-commit l'inspection, mais pas bon non plus.
- Vous devez supprimer les
exec
s à partir de ce code (voirman sh
). Il est impossible pour n'importe quel interpréteur de commande à exécuter après uneexec
, depuisexec
clobbers le processus actuel, c'est à dire la coquille qui est utilisé pour interpréter les commandes.
Vous devez vous connecter pour publier un commentaire.
Depuis git add a également pas de travail pour moi, dans un pré commettre, j'ai suivi marque l'idée d'utiliser un .s'engager fichier et le fractionnement du processus de pré - et post-commit.
Voici un code qui devrait être facile à comprendre
Dans le pre-commit:
Dans le post-commit:
Espère que cela rend plus facile pour les gens avec peu de bash connaissances nécessaires pour suivre la marque de son idée.
-a
être-e
pour tester si.commit
existent?-a
primaire a été introduit comme un KornShell proposition et a fait son chemin POSIX, c'est uniquement pris en charge aujourd'hui pour la compatibilité ascendante. plus tard-e
a été ajouté pour éviter toute confusion de la-a
primaire avec le-a
binaire de l'opérateur.-a
. linux.die.net/man/1/test La seule utilisation que j'ai trouvé est logiqueand
.test
de commande page de man unix.com. de recherche de la page pour le terme de ", Une première proposition a utilisé le KornShell -un primaire"-a
devrait probablement jamais être utilisé autrement que comme un opérateur booléen juste pour éviter la confusion.Il est possible de faire ce que vous voulez à l'aide de pré-engager les crochets. Nous faisons la même chose pour un heroku de déploiement (compilation de coffeescript, javascript). La raison que votre script n'est pas le travail, c'est parce que vous avez utilisé la
exec
commande mal.De la page de man:
Seulement votre première commande exec est en cours d'exécution. Après que votre script est essentiellement terminée.
Donner quelque chose comme ceci un essai (en tant que pre-commit hook):
git add
pas de travail dans git version 2.1.0git add
ne fonctionne pas dans la version git 2.6.42.11.0
soit. Les modifications sont ajoutées, mais pas commis.Vous pouvez utiliser une combinaison de pré-et post-script de validation.
Dans le pre-commit:
Dans le post-commit:
si .s'engager existe vous savez de validation a eu lieu, mais un post-commit n'a pas exécuté encore. Ainsi, vous pouvez faire votre génération de code ici. En outre, test pour .s'engager, et si elle existe:
Grosso modo, c'est le processus que j'utilise pour stocker un .le fichier de métadonnées dans le référentiel généré à partir de metastore.
Si quelqu'un connaît une meilleure façon que je suis toutes les oreilles, mais il semble fonctionner pour l'instant.
Cela a très bien fonctionné pour moi.
Il sera partie intégrante de la commettre.
git version 1.7.12.4 (Apple Git-37)
cd $(git rev-parse --show-toplevel)
git commit
, l'ajout de fichiers n'apparaissent pas dans le générés automatiquement le message de validation, mais ils seront quand-même ajouté.Vous pouvez utiliser
update-index
:git update-index --add my_files
git update-index --add my_files
?update-index
sera ce que vous en avez besoin, aussi: http://ftp.sunet.se/pub/Linux/kernel.org/software/scm/git/docs/...git add
etgit update-index --add
. Dans les deux cas, les fichiers sont ajoutés au référentiel (de sorte qu'ils se retrouvaient dans la suivant commit), mais pas le commit courant.Si les fichiers sont générés automatiquement, et ils peuvent être générés n'importe où (implicite dans votre désir de construire dans le Git pre-commit hook), alors vous ne devriez pas être de les mettre sous contrôle de code source en premier lieu. Vous ne devriez contrôle de la source des fichiers-les fichiers générés devraient être générés dans le cadre de la construction de scripts.
La seule raison de mettre un fichier généré sous contrôle de code source, c'est quand il exige unique/des ressources pour générer (comme un programme sous licence) ou qu'il nécessite une quantité importante de temps à générer.
Ajouté
De http://git-scm.com/docs/githooks :
L'intention de le pre-commit hook est un pass-fail vérifier l'état de l'espace de travail et le contenu de la livraison, avant de s'engager. De tenter de modifier le contenu de la validation ne fonctionne pas.
Ma recommandation serait d'ajouter deux étapes de vos scripts de construction: (1) une étape qui permettra de construire tous les out-of-date, les fichiers qui doivent être produites (et les ajoute à l'espace de travail), et (2) une étape qui va vérifier pour s'assurer que tous les fichiers générés sont à jour, et de retour non nulle code d'état. Votre Git pre-commit hook doit exécuter la deuxième étape. Vos développeurs devraient être formés pour exécuter la première étape nécessaire.
Comment de l'écriture d'un
post-commit
script à la place qui génère de vos fichiers, puis ont que faire (quelque chose le long des lignes de)git add my_files; git commit --amend
.J'ai eu le même besoin et cette approche a fonctionné assez bien pour moi:
où "create_my_files" doit être exécutable, par exemple si c'est un python fichier, vous pouvez l'exécuter en tant que "python create_my_files && git add my_files"
et il est vrai que vous n'avez pas besoin d'un pré-s'engager à s'engager de nouveau (qui permettrait de créer une infinie boucle méchant :p)
git add
dans unpre-commit
crochet ne pas fonctionner comme prévu pour moi dans Git 2.6.4Oui, vous pouvez ajouter des fichiers générés automatiquement sur la valider à l'aide de git crochets! Mais il faut un délicat script.
Ici, vous pouvez trouver le problème résolu. Là, c'est la mise à jour de la version de fichier à chaque livraison, l'ajout d'un nouveau fichier modifié et modifiant le commit que vous en avez besoin pour. Il est entièrement de travail:
https://github.com/evandrocoan/.versioning
Alors que vous venez de remplacer la Version du Fichier de Remplacement de l'algorithme sur le fichier updateVersion.sh " par votre algorithme. Peut-être vous avez besoin de changer quelques petites choses comme, retirez la branche de limitation, parce que là, le script ne s'exécute que si vous êtes sur la " développer la branche.
Aussi, il suffira de modifier le fichier spécifié, s'est mis en scène. Si le fichier n'est pas mis en scène, alors il ne fera rien que de normal/habituel commettre. Plus précisément, il imprime ce qu'il fait à chaque étape.
Je vais vous expliquer, ce truc. Il est assez délicat. Sur le préparer-commit-msg-crochet, il détecte si le fichier est en cours de mise en scène et l'engage. Après cela, il crée un fichier flag, et arrête de le préparer-commit-msg-crochet.
Plus tard sur le post-commit-crochet, il vérifie si le fichier flag existe. Si oui, il modifie les fichiers sur le commettre.
Attention, il serait de créer une boucle infini, car il appelle de nouveau le préparer-commit-msg-crochet (comme nous sommes de modification). Mais il ne se produit pas parce que le drapeau de fichier. Lors de la préparation de validation-msg-crochet court et trouver le drapeau de fichier, il "sait" ce qui se passe. Ensuite, il supprime juste le drapeau de fichier et de ne pas créer de nouveau. En le faisant, il bloque le post-commit-crochet de modifier de nouveau le commet, permettant à l'engager à terminer pour de bon.
J'étais en face d'un même problème en pre-commit hook aussi. J'ai été en modifiant un fichier et de le commettre, mais elle a été prise précédente d'un fichier non-mise à jour du fichier se fait par l'ajout commande git(ci-dessous) en pre-commit hook, il n'en résout.
remarque:
$file
est votre fichier à ajouter.Merci,