Символічне посилання на гачок у git


86

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

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

Але це, здається, не працює, будь-які ідеї чому? "ln hooks / post-merge .git / hooks / post-merge" працює нормально, але створення жорсткого посилання те саме, що копіювання, я думаю ....


22
Оскільки символічне посилання вирішено щодо його розташування. Символьне посилання, .git/hooks/що вказує на, hooks/post-mergeотримує вирішення .git/hooks/hooks/post-merge, яке не існує. Ви хочете ln -s -f ../../hooks/post-merge .git/hooks/post-merge. Або зробити ваше життя простіше: ln -s -f ../hooks .git/hooks. Ваша проблема не має нічого спільного з git.
Арістотель Пагальціс

1
stackoverflow.com/questions/3462955/… та stackoverflow.com/questions/427207/…stackoverflow.com/questions/3703159/… ) вказують на той факт, що символічне посилання може працювати.
VonC

Виправте мене, якщо я помиляюся, але Symlink все одно потрібно налаштувати для кожної робочої станції. Єдине, що це зберігає, - це копіювання навколо вручну або написання іншої команди, яка копіює відстежуваний файл гачка .git/hooks.
adi518

Відповіді:


161

ви щойно використали неправильний шлях, він повинен бути:

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

10
Я не розумію, чому мені потрібно підняти два каталоги, щоб зв'язати ресурс, який знаходиться в папці, в яку я cdпотрапив. Чи не повинно бути просто ln -s ./hooks/?
Droogans

45
Це. Коли git оцінює символічне посилання, він, мабуть, робить це, використовуючи .git/hooksяк робочий каталог, тому відносні шляхи повинні бути відносно цього каталогу. Це є більш зрозумілим, якщо ви спочатку cdвступили .git/hooksперед створенням символічного посилання та зрозуміли відносний шлях звідти.
Еліот

12
@Eliot ні на створення, ні на розрішення символічних посилань не впливає робочий каталог. Все, що ви дасте, lnбуде збережено як цільове та вирішено щодо місця розташування посилання.
Joó Ádám

2
@ JoóÁdám Ти маєш рацію. Отже, проблема тут у тому, що вихідна команда вказує неправильний відносний шлях. Тим не менше, cdвхід у систему .git/hooksперед тим, як зробити посилання, допоможе вам написати команду, оскільки потім ви зможете самозавершитись до правильного шляху.
Еліот

1
Врешті-решт усе це у мене спрацювало. Різниця лише в тому, що я пов'язую зі своїм prepare-commit-msg. Проблема полягає в тому, що я редагую повідомлення про фіксацію за допомогою nano, тоді Ctl + X out, щоб перервати, git все одно завершує коміт, замість того, щоб перервати так, як це було до того, як я зробив цю зміну. Чи є спосіб нано-виходу, не викликаючи завершення цього коміту?
frakman1

15

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

git config core.hooksPath hooks/

Який за замовчуванням є локальним, тому він не зіпсує git hooks для інших ваших проектів. Це працює для всіх хуків у цьому сховищі, тому це особливо корисно, якщо у вас більше одного хука.

Якщо у вас вже є власні хуки, .git/hooks/якими ви не хочете ділитися зі своєю командою, ви можете додати їх у хуки / і додати, .gitignoreщоб вони не були спільними.


Дуже хороша! Зручний фокус :) Здається, це набагато більш надійне майбутнє, ніж їхнє пов'язування.
JKP

2

Зміна каталогу перед посиланням

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

Ще простіше після cd :ln -s -f ../../hooks/post-merge
jamesdlin

0

Розрахунок шляху виконується щодо символьного посилання. Давайте розберемося на прикладі,

ln -s path/to/file symlink/file

Тут шлях до файлу насправді повинен бути відносним шляхом до шляху символьного посилання.
Система фактично обчислює шлях до файлу, як symlink/path/path/to/file
вищезазначену команду слід переписати як

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

структуру папки,

/ код
------ символьне посилання / файл
------ шлях / до / файлу


0

Використовуючи коментар Майкла Цихара, ось приклад сценарію 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-хуки називаються "попереднім фіксацією", "попереднім натисканням" тощо, тому вони будуть пов'язані символом.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.