167 votes

Validation automatique fabrication git

Je voudrais utiliser git pour enregistrer toutes les modifications dans un fichier.

Est-il un moyen que je peux tourner git « validation » à automatiquement arriver chaque fois qu’un fichier est mis à jour - donc il y a une nouvelle validation pour chaque modification d’un fichier ?

Idéalement, j’aimerais que mes utilisateurs à ne même pas savent que git est en marche dans les coulisses. Un utilisateur pourrait alors potentiellement « annuler » modifications dans un fichier - et cela pourrait se faire en tirant sur une version précédente de git.

135voto

JesperE Points 34356

Sous Linux, vous pouvez utiliser inotifywait pour exécuter automatiquement une commande chaque fois le contenu d’un fichier est modifié.

Edit : la commande suivante s’engage à file.txt dès qu’elle est enregistrée :

57voto

Lester Buck Points 408

Le plus tôt inotifywait réponse est grande, mais ce n'est pas une solution complète. Comme l'a écrit, c'est un one shot de s'engager pour un changement dans un fichier. Il ne fonctionne pas pour le cas où la modification d'un fichier crée un nouvel inode avec le nom d'origine. inotifywait -m apparemment suit fichiers par inode, non par leur nom. Aussi, après que le fichier a changé, il n'est pas mis en scène pour git commit sans git add ou git commit-a. Procéder à certains ajustements, voici ce que j'utilise sur Debian pour suivre toutes les modifications apportées à mon fichier de calendrier:

/etc/rc.local:


su -c /home/<username>/bin/gitwait -l <username>

/home/<username>/bin/gitwait:


#!/bin/bash
#
# gitwait - watch file and git commit all changes as they happen
#

while true; do

  inotifywait -qq -e CLOSE_WRITE ~/.calendar/calendar

  cd ~/.calendar; git commit -a -m 'autocommit on change'

done

Cela pourrait être généralisée à attendre sur une liste de fichiers et/ou répertoires, et le correspondant de inotifywait processus, et de redémarrer chaque inotifywait qu'un fichier est modifié.

32voto

Nevik Rehnel Points 5446

Les réponses précédentes recommander inotifywait pour ce travail à bout de moi off dans la bonne direction quand j'ai eu ce problème moi-même, j'ai donc écrit un petit script. D'abord cela ne pouvait que regarder l'ensemble des dossiers de manière récursive (à l'opposé de Lester de Buck exemple), mais j'ai aussi voulu regarder un fichier quelque part d'autre, j'ai donc élargi.

Le résultat est un script actuellement appelés gitwatch, comme c'est ce qu'il fait: il regarde un fichier ou un dossier pour les changements (à l'aide de inotifywait), et les engage dans un dépôt git.

Vous pouvez trouver le script, plus d'informations et des instructions sur github: https://github.com/nevik/gitwatch

17voto

rafak Points 3310

git-TEC est une excellente solution qui fonctionne bien pour moi. « WIP » est synonyme de « work in progress ». Chaque fois que vous exécutez « git wip », les modifications sont engagés à une branche distincte. Il peut être exécuté sur la ligne de commande, mais il existe des extensions pour vim et emacs à git-wip automatiquement l’exécution chaque fois qu’un fichier est écrit.

14voto

Redzarf Points 447

Je voulais pour ce faire, dans windows, et a trouvé le meilleur moyen était d'utiliser le Répertoire de Moniteur pour vérifier les modifications, puis lorsqu'il a détecté un changement de l'exécuter:

Programme: cmd.exe

Params: /C C:\pathToBatchFile.bat

Que fichier batch:

c:
cd c:\gitRepoDirectory\
(if exist "%PROGRAMFILES(X86)%" (
"%PROGRAMFILES(X86)%\git\bin\sh.exe" --login -i -c "git commit -am AutoCommitMessage"
) else (
"%PROGRAMFILES%\git\bin\sh.exe" --login -i -c "git commit -am AutoCommitMessage"
))

J'ai aussi essayé d'avoir une autre commande pour ajouter des fichiers ("%PROGRAMFILES(X86)%\git\bin\sh.exe" --login -i -c "git add *.*"), mais je ne pense pas que je l'ai eu à travailler correctement.

J'ai aussi fait un post-commit hook contenant:

#!/bin/sh
git.exe pull -v --progress  "origin"
git.exe push    --progress  "origin" master:master
curl.exe -s https://webserverdomain.com/updateFromGitHook.x?r=repoName

(Si il y avait des conflits, puis il abandonne la traction et abandonner le pousser, mais il n'y avait pas de façon claire de dire ce qui s'était passé - à la fin, nous avons abandonné l'idée à cause de ce défaut.)

Qui commande curl dit à mon serveur qu'il est nécessaire de faire une traction sur le code. Tout ce qui était nécessaire pour traiter en php est:

<?
$r = $_GET['r'];
if (!empty($c)) {
    //use system instead of exec if you want the output to go back to the git client
    exec("cd /path/to/repo/parent/$r; sudo git reset --hard HEAD; sudo git pull;");
    echo "\n\nServer: Updated\n\n";
} else {
    echo "\n\nServer: UPDATE FAILED\n\n";
}
?>

Le seul problème avec cela était-il nécessaire pour être exécuté par l'utilisateur root à la place de l'utilisateur apache, donc, j'ai aussi eu à faire un fichier dans /etc/sudoers.d/ contenant:

www-data ALL = NOPASSWD: /usr/bin/git

Pour moi, je pense que cela a fonctionné assez solidement. Annuaire Moniteur peut être configuré pour s'exécuter au démarrage et commencer à les réduire, il peut regarder plusieurs dossiers différents

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