独自のカスタムポストマージフックを作成し、メインプロジェクトフォルダーに「hooks」ディレクトリを追加しました(gitは.git/hooksの変更を追跡しないため)、どこかでフックからシンボリックリンクを作成できることを読みました誰かがそれを変更するたびに1つのフォルダから他のフォルダにファイルをコピーする必要がないように.git/hooksに
ln -s -f hooks/post-merge .git/hooks/post-merge
しかし、それはうまくいかないようです、なぜアイデアがありますか? 「ln hooks/post-merge .git/hooks/post-merge」は正常に動作しますが、ハードリンクを作成することはcopyinと同じです。
間違ったパスを使用しただけで、次のようになります。
ln -s -f ../../hooks/post-merge .git/hooks/post-merge
シンボリックリンクを使用できますが、git設定でプロジェクトのフックフォルダーを変更することもできます。
git config core.hooksPath hooks/
これはデフォルトでローカルなので、他のプロジェクトのgitフックを台無しにしません。このリポジトリのすべてのフックで機能するため、複数のフックがある場合に特に役立ちます。
チームと共有したくない.git/hooks/
に既にカスタムフックがある場合は、hooks /に追加して、共有されないように.gitignore
を追加できます。
リンクする前にディレクトリを変更する
cd /path/to/project-repo/.git/hooks
ln -s -f ../../hooks/post-merge ./post-merge
なぜ単にcp ./hooks/* .git/hooks /
これはMac OSで私のために働いた
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 /ディレクトリ内でファイル拡張子がサフィックスとして付けられていないファイルをシンボリックリンクします。このディレクトリ+このスクリプト(symlink.shという名前)にREADME.txtがあります。実際のgitフックはすべて「pre-commit」、「pre-Push」などの名前が付けられているため、シンボリックリンクされます。
パスの計算は、シンボリックリンクに対して行われます。例を使って理解しましょう。ln -s path/to/file symlink/file
ここで、ファイルへのパスは、実際にはシンボリックリンクパスからの相対パスである必要があります。
システムは実際にファイルパスをsymlink/path/path/to/file
上記のコマンドは次のように書き換える必要があります。ln -s ../path/to/file symlink/path
フォルダ構造は、
/コード
------ symlink/file
------ path/to/file