Символическая ссылка на крючок в git - PullRequest
74 голосов
/ 04 января 2011

Я написал свой собственный хук после слияния, теперь я добавил каталог "hooks" в основную папку моего проекта (поскольку git не отслеживает изменения в .git / hooks), где-то я читал, что могу сделать символическийссылка из ловушек на .git / hooks, поэтому мне не нужно копировать файл из одной папки в другую каждый раз, когда кто-то меняет его, поэтому я попытался:

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

Но этоне похоже на работу, есть идеи, почему?"ln hooks / post-merge .git / hooks / post-merge" работает нормально, но создание жесткой ссылки - то же самое, что copyin, я думаю ....

Ответы [ 6 ]

149 голосов
/ 04 января 2011

вы просто использовали неверный путь, оно должно быть:

ln -s -f ../../hooks/post-merge .git/hooks/post-merge
8 голосов
/ 18 сентября 2018

Хотя вы можете использовать символические ссылки, вы также можете изменить папку ловушек для вашего проекта в настройках git с помощью:

git config core.hooksPath hooks/

Это локально по умолчанию, поэтому оно не разрушит ловушки git для вашего проекта.другие проекты.Он работает для всех хуков в этом репозитории, поэтому он особенно полезен, если у вас более одного хука.

Если у вас уже есть пользовательские хуки в .git/hooks/, которыми вы не хотите делиться с вашей командой, вы можете добавитьих в хуках / и добавьте .gitignore, чтобы они не были общими.

2 голосов
/ 10 апреля 2017

Смена каталога перед установкой ссылки

cd /path/to/project-repo/.git/hooks
ln -s -f ../../hooks/post-merge ./post-merge
0 голосов
/ 21 ноября 2018

Используя комментарий Майкла Цихара, вот пример сценария bash, который я написал, чтобы просто создать эти символические ссылки. Этот скрипт находится в git_hooks / dir, который находится в корне проекта. Моя папка .git / также находится на том же уровне каталогов.

#!/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

Мой скрипт должен быть запущен из самого каталога git_hooks /. Вы можете изменить его, чтобы вести себя по-другому, если хотите.

Этот скрипт будет символически ссылаться на любой файл, в котором нет суффикса с расширением в каталоге git_hooks /. У меня есть README.txt в этом каталоге + этот скрипт (с именем symlink.sh). Все фактические git-хуки называются «pre-commit», «pre-push» и т. Д., Поэтому они будут связаны символами.

0 голосов
/ 31 июля 2018

Расчет пути выполняется относительно символической ссылки.Давайте разберемся на примере:

ln -s path/to/file symlink/file

Здесь путь к файлу должен фактически быть относительным путем от пути символической ссылки.
Система фактически вычисляетпуть к файлу symlink/path/path/to/file
Указанная выше команда должна быть переписана как

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

Структура папок:

/ code
------ символическая ссылка / файл
------ путь / к / файлу

0 голосов
/ 20 октября 2017

почему бы не просто cp ./hooks/* .git / hooks /

это работало для меня в Mac OS

...