web-dev-qa-db-fra.com

Lien symbolique vers un hook in git

J'ai écrit mon propre hook post-fusion personnalisé, maintenant j'ai ajouté un répertoire "hooks" à mon dossier de projet principal (car git ne suit pas les modifications dans .git/hooks), j'ai lu quelque part que je pouvais créer un lien symbolique à partir de hooks. to .git/hooks afin que je n'ai pas à copier le fichier d'un dossier à l'autre chaque fois que quelqu'un le modifie, alors 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-fusion .git/hooks/post-merge" fonctionne bien, mais créer un lien dur est le même que copier, je suppose ....

65
Mateusz Dymczyk

vous venez d'utiliser le mauvais chemin, il devrait être:

ln -s -f ../../hooks/post-merge .git/hooks/post-merge
139
Michal Čihař

Bien que vous puissiez utiliser des liens symboliques, vous pouvez également modifier le dossier des crochets de votre projet dans vos paramètres git avec:

git config core.hooksPath hooks/

Ce qui est local par défaut pour ne pas gâcher les hooks git pour vos autres projets. Cela fonctionne pour tous les hooks de ce référentiel, il est donc 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 voulez pas partager avec votre équipe, vous pouvez les ajouter dans des hooks/et ajouter un .gitignore afin qu'ils ne soient pas partagés.

4
Pierre.Sassoulas

Changer de répertoire avant de créer un lien

cd /path/to/project-repo/.git/hooks
ln -s -f ../../hooks/post-merge ./post-merge
2
Jekis

pourquoi pas juste cp ./hooks/* .git/hooks /

cela a fonctionné pour moi sous Mac OS

0
Frazko

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

#!/usr/bin/env bash

pwd=$(pwd);

# Script is designed to be ran from git_hooks/ dir
if [[ "$pwd" == *"git_hooks"* ]]; then

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

   while read -r file; do

     ln -s ../../git_hooks/$file ../.git/hooks/
     echo "Linked $file -> ../.git/hooks/$file"

   done <<< "$files";

else

  echo "";
  echo "ERROR: ";
  echo "You must be within the git_hooks/ dir to run this command";
  exit 1;

fi

Mon script doit être exécuté à partir du 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 avec tout fichier ne portant pas suffixe d'extension dans le répertoire git_hooks /. J'ai un fichier README.txt dans ce répertoire + ce script (nommé symlink.sh). Tous les hooks git sont nommés 'pre-commit', 'pre-Push', etc.

0
cchoe1

Le calcul du chemin est fait par rapport au lien symbolique. Comprenons en utilisant un exemple,

ln -s path/to/file symlink/file 

Ici, le chemin du fichier doit être en réalité le chemin relatif du chemin des liens symboliques.
Le système calcule le chemin du fichier sous la forme symlink/path/path/to/file
La commande ci-dessus doit être réécrite comme 

ln -s ../path/to/file symlink/path 

La structure du dossier étant, 

/code
------ lien symbolique/fichier
------ chemin/vers/fichier

0
swayamraina