Linux git中挂钩的符号链接

Linux git中挂钩的符号链接,linux,git,githooks,Linux,Git,Githooks,我编写了自己的自定义合并后钩子,现在我在我的主项目文件夹中添加了一个“hooks”目录(因为git不跟踪.git/hooks中的更改),在某个地方我读到,我可以创建一个从钩子到.git/hooks的符号链接,这样我就不必每次有人更改时都将文件从一个文件夹复制到另一个文件夹,因此我尝试: ln-s-f hooks/post-merge.git/hooks/post-merge 但它似乎不起作用,你知道为什么吗?“ln hooks/post merge.git/hooks/post merge”工作

我编写了自己的自定义合并后钩子,现在我在我的主项目文件夹中添加了一个“hooks”目录(因为git不跟踪.git/hooks中的更改),在某个地方我读到,我可以创建一个从钩子到.git/hooks的符号链接,这样我就不必每次有人更改时都将文件从一个文件夹复制到另一个文件夹,因此我尝试:

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


但它似乎不起作用,你知道为什么吗?“ln hooks/post merge.git/hooks/post merge”工作正常,但制作硬链接与复制相同,我想….

您刚才使用了错误的路径,应该是:

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

链接前更改目录

cd /path/to/project-repo/.git/hooks
ln -s -f ../../hooks/post-merge ./post-merge
为什么不 cp./hooks/*.git/hooks/


这对我在Mac OS中起到了作用

路径计算是相对于符号链接进行的。让我们用一个例子来理解,

ln-s路径/to/file符号链接/file

在这里,文件的路径实际上应该是符号链接路径的相对路径。
系统实际将文件路径计算为
symlink/path/path/to/file

上述命令应重新编写为

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


文件夹结构为,

/代码
------符号链接/文件
------路径/到/文件


虽然可以使用符号链接,但也可以在git设置中更改项目的hooks文件夹,方法是:

git config core.hooksPath hooks/
默认情况下,它是本地的,所以不会破坏其他项目的git挂钩。它适用于这个存储库中的所有钩子,所以如果您有多个钩子,它尤其有用


如果您在
.git/hooks/
中已经有了不想与您的团队共享的自定义钩子,您可以将它们添加到hooks/中,并添加一个
.gitignore
,这样它们就不会被共享。

利用Michael Cihar的评论,下面是我编写的一个bash脚本示例,用于创建这些符号链接。该脚本位于项目根目录下的git_hooks/dir中。My.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
#/usr/bin/env bash
pwd=$(pwd);
#脚本设计为从git_hooks/dir运行
如果[[“$pwd”=*“git_hooks”*];然后
files=$(ls | grep-v-e.*\);
读取-r文件时;做
ln-s.././git_hooks/$file../.git/hooks/
echo“Linked$file->...git/hooks/$file”

完成,因为符号链接是相对于其位置解析的。
.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无关。和(和)指出符号链接可以工作的事实。如果我错了,请纠正我,但每个工作站仍然必须设置一个符号链接。这保存的唯一一件事是手动复制它,或者编写另一个命令将跟踪的钩子文件复制到
.git/hooks
。我不明白为什么我需要上两个目录来链接位于我的
cd
'd文件夹中的资源。它不应该是
ln-s./hooks/
?这就是。当git评估符号链接时,它显然使用
.git/hooks
作为其工作目录,因此相对路径应该是相对于该目录的。如果在创建符号链接之前先将
cd
放入
.git/hooks
,并从中找出相对路径,则更容易说明问题。@Eliot符号链接的创建和解析都不受工作目录的影响。你给出的
ln
将被存储为目标,并相对于链接的位置进行解析。@Joódám你说得对。所以这里的问题是原始命令指定了不正确的相对路径。不过,在创建链接之前,
cd
插入
.git/hooks
将帮助您编写命令,因为您可以自动完成到正确的路径。所有这些最终都对我起到了作用。唯一的区别是我正在链接到我自己的
prepare commit msg
。问题是,如果我使用nano编辑提交消息,然后Ctl+X out中止,git仍然会完成提交,而不是像我进行此更改之前那样中止。有没有办法让nano退出而不导致提交完成?因为
我不必每次有人更改时都将文件从一个文件夹复制到另一个文件夹
甚至更简单,在
cd
之后:
ln-s-f.././hooks/post merge
非常好!一个方便的技巧:)似乎比sym一个接一个地链接它们更适合未来。git>2.9支持此功能