gitのフックへのシンボリックリンク


86

独自のカスタムマージ後フックを作成しました。メインプロジェクトフォルダーに「hooks」ディレクトリを追加しました(gitは.git / hooksの変更を追跡しないため)。どこかで、フックからシンボリックリンクを作成できると読みました。 .git / hooksに変更するので、誰かがファイルを変更するたびに1つのフォルダーから別のフォルダーにファイルをコピーする必要がないので、次のことを試しました。

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

しかし、それはうまくいかないようです、なぜ何か考えがありますか?「lnhooks / post-merge .git / hooks / post-merge」は正常に機能しますが、ハードリンクの作成はcopyinと同じだと思います。


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とは何の関係もありません。
アリストテレスパガルツィス2011年

1
stackoverflow.com/questions/3462955/…およびstackoverflow.com/questions/427207/…(およびstackoverflow.com/questions/3703159/…)は、シンボリックリンクが機能するという事実を指摘しています。
vonC 2011年

間違っている場合は訂正してください。ただし、ワークステーションごとにシンボリックリンクを設定する必要があります。これで節約できるのは、手動でコピーするか、追跡されたフックファイルをにコピーする別のコマンドを作成することだけ.git/hooksです。
adi5 1819年

回答:


161

間違ったパスを使用しただけです。次のようになります。

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

10
自分が入れたフォルダにあるリソースをリンクするために、なぜ2つのディレクトリに移動する必要があるのか​​わかりませんcd。それだけではいけませんln -s ./hooks/か?
Droogans 2013

45
この。gitがシンボリックリンクを評価しているときは.git/hooks、作業ディレクトリとして使用しているようです。したがって、相対パスはそのディレクトリからの相対パスである必要があります。シンボリックリンクを作成cdする.git/hooks前に最初にアクセスし、そこからの相対パスを把握すると、これはより自明です。
エリオット

12
@Eliotシンボリックリンクの作成も解決も、作業ディレクトリの影響を受けません。あなたが与えたものlnは何でもターゲットとして保存され、リンクの場所に関連して解決されます。
チュ・アダム

2
@JoóÁdámその通りです。したがって、ここでの問題は、元のコマンドが誤った相対パスを指定していることです。それでも、リンクを作成cdする.git/hooks前に入力すると、正しいパスにオートコンプリートできるため、コマンドを作成するのに役立ちます。
エリオット

1
結局、これはすべて私のために働いた。唯一の違いは、私が自分自身にリンクしていることprepare-commit-msgです。問題は、nanoを使用してコミットメッセージを編集している場合、Ctl + Xを出力して中止しても、この変更を行う前のように中止するのではなく、gitがコミットを完了することです。このコミットを完了させずにnanoを終了させる方法はありますか?
frakman1 2017年

15

シンボリックリンクを使用できますが、git設定でプロジェクトのhooksフォルダーを次のように変更することもできます。

git config core.hooksPath hooks/

これはデフォルトでローカルであるため、他のプロジェクトのgitフックを台無しにすることはありません。このリポジトリ内のすべてのフックで機能するため、複数のフックがある場合に特に便利です。

.git/hooks/チームと共有したくないカスタムフックがすでにある場合は、それらをhooks /に追加し、.gitignore共有されないように追加できます。


非常に素晴らしい!便利なトリック:)それらを1つずつシンボリックリンクするよりもはるかに将来性があるようです。
JKP

2

リンクする前にディレクトリを変更する

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

さらに簡単に、cdln -s -f ../../hooks/post-merge
jamesdlin19年

0

パスの計算は、シンボリックリンクを基準にして行われます。例を使って理解しましょう、

ln -s path/to/file symlink/file

ここで、ファイルへのパスは、実際にはシンボリックリンクパスからの相対パスである必要があります。
システムは実際にファイルパスを次symlink/path/path/to/file
のように計算します。上記のコマンドは次のように書き直す必要があり

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

ます。フォルダ構造は次のとおりです。

/ code
------ symlink / file
------ path / to / file


0

Michael Ciharのコメントを利用して、これらのシンボリックリンクを作成するために私が作成した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」などの名前が付けられているため、シンボリックリンクされます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.