符号链接到git中的钩子

时间:2011-01-04 10:58:04

标签: 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”工作正常,但制作一个硬链接与copyin相同,我想......

6 个答案:

答案 0 :(得分:146)

你刚使用错误的路径,应该是:

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

答案 1 :(得分:5)

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

git config core.hooksPath hooks/

默认情况下它是本地的,因此它不会破坏其他项目的git hooks。它适用于此存储库中的所有钩子,因此如果您有多个钩子,则特别有用。

如果您不想与您的团队共享.git/hooks/中的自定义钩子,则可以将其添加到hooks /中,并添加一个.gitignore以便不共享。

答案 2 :(得分:2)

在链接之前更改目录

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

答案 3 :(得分:0)

为什么不呢     cp ./hooks/* .git / hooks /

这在Mac OS中适用于我

答案 4 :(得分:0)

相对于符号链接完成路径计算。让我们看一个例子,

ln -s path/to/file symlink/file

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

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

文件夹结构为

  

/代码
  ------ symlink /文件
  ------路径/到/文件

答案 5 :(得分:0)

在这里,利用Michael Cihar的评论,我写了一个bash脚本示例来创建这些符号链接。该脚本位于项目根目录下的git_hooks /目录中。我的.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 /目录中未带有文件扩展名的任何文件。我在此目录+此脚本(名为symlink.sh)中具有README.txt。所有实际的git钩子都被命名为“ pre-commit”,“ pre-push”等,因此它们将被符号链接。