106 votes

Lien symbolique vers un crochet dans git

J'ai écrit mon propre hook post-merge personnalisé, maintenant j'ai ajouté un répertoire "hooks" à mon dossier principal du projet (puisque git ne suit pas les modifications dans .git/hooks), quelque part j'ai lu que je peux créer un lien symbolique de hooks à .git/hooks pour ne pas avoir à copier le fichier d'un dossier à l'autre à chaque fois que quelqu'un le modifie donc j'ai essayé :

ln -s -f hooks/post-merge .git/hooks/post-merge

Mais cela ne semble pas fonctionner, des idées pourquoi ? "ln hooks/post-merge .git/hooks/post-merge" fonctionne très bien mais créer un lien dur est la même chose qu'une copie je suppose....

184voto

Michal Čihař Points 3981

Vous avez simplement utilisé le mauvais chemin, il doit être :

ln -s -f ../../hooks/post-merge .git/hooks/post-merge

37voto

Pierre.Sassoulas Points 585

Alors que vous pouvez utiliser des liens symboliques, vous pouvez également changer le dossier hooks pour votre projet dans vos paramètres git avec :

git config core.hooksPath hooks/

Ce qui est local par défaut donc cela ne ruine pas les hooks git pour vos autres projets. Cela fonctionne pour tous les hooks dans ce dépôt, donc c'est particulièrement utile si vous avez plus d'un hook.

Si vous avez déjà des hooks personnalisés dans .git/hooks/ que vous ne souhaitez pas partager avec votre équipe, vous pouvez les ajouter dans le dossier hooks/ et ajouter un .gitignore de sorte qu'ils ne sont pas partagés.

3voto

Jenechka Points 862

Changer de répertoire avant de lier

cd /chemin/vers/projet-repo/.git/hooks
ln -s -f ../../hooks/post-merge ./post-merge

1voto

swayamraina Points 431

Le calcul du chemin est relatif au lien symbolique. Comprenons cela à l'aide d'un exemple,

ln -s chemin/vers/le/fichier lien_symbole/fichier

Ici, le chemin du fichier doit en fait être le chemin relatif à partir du chemin du lien symbolique.
Le système calcule en fait le chemin du fichier comme lien_symbole/chemin/vers/le/fichier
La commande ci-dessus devrait être réécrite comme

ln -s ../chemin/vers/le/fichier lien_symbole/chemin

La structure du dossier étant,

/code
------ lien_symbole/fichier
------ chemin/vers/le/fichier

0voto

cchoe1 Points 153

En utilisant le commentaire de Michael Cihar, voici un exemple de script bash que j'ai écrit pour simplement créer ces liens symboliques. Ce script est situé dans le répertoire git_hooks/ qui se trouve à la racine du projet. Mon dossier .git/ est également situé au même niveau de répertoire.

#!/usr/bin/env bash

pwd=$(pwd);

# Le script est conçu pour être exécuté à partir du répertoire git_hooks/
if [[ "$pwd" == *"git_hooks"* ]]; then

  files=$(ls | grep -v -e '.*\.');

   while read -r file; do

     ln -s ../../git_hooks/$file ../.git/hooks/
     echo "Lien créé $file -> ../.git/hooks/$file"

   done <<< "$files";

else

  echo "";
  echo "ERREUR: ";
  echo "Vous devez être dans le répertoire git_hooks/ pour exécuter cette commande";
  exit 1;

fi

Mon script doit être exécuté à partir du véritable répertoire git_hooks/. Vous pouvez le modifier pour qu'il se comporte différemment, si vous le souhaitez.

Ce script créera un lien symbolique pour tout fichier qui n'est pas suffixé par une extension de fichier dans le répertoire git_hooks/. J'ai un README.txt dans ce répertoire + ce script (nommé symlink.sh). Tous les véritables hooks git sont nommés 'pre-commit', 'pre-push', etc. donc ils seront liés symboliquement.

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