94

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

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

但它似乎不起作用,任何想法为什么?“ln hooks/post-merge .git/hooks/post-merge”工作正常,但制作硬链接与我猜的 copyin 相同....

4

6 回答 6

173

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

ln -s -f ../../hooks/post-merge .git/hooks/post-merge
于 2011-01-04T14:30:27.210 回答
25

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

git config core.hooksPath hooks/

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

如果您已经有.git/hooks/不想与您的团队共享的自定义挂钩,您可以将它们添加到 hooks/ 并添加 a.gitignore以便它们不共享。

于 2018-09-18T09:04:58.390 回答
2

链接前更改目录

cd /path/to/project-repo/.git/hooks
ln -s -f ../../hooks/post-merge ./post-merge
于 2017-04-10T13:02:47.857 回答
1

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

ln -s path/to/file symlink/file

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

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

文件夹结构为,

/code
------ 符号链接/文件
------ 路径/到/文件

于 2018-07-31T18:24:48.747 回答
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/ 目录中没有后缀的任何文件进行符号链接。我在这个目录中有一个 README.txt + 这个脚本(名为 symlink.sh)。所有实际的 git 钩子都被命名为“pre-commit”、“pre-push”等,因此它们将被符号链接。

于 2018-11-21T17:51:53.683 回答
-2

为什么不只是 cp ./hooks/* .git/hooks/

这在 Mac OS 中对我有用

于 2017-10-20T20:56:36.890 回答