Ich habe meinen eigenen Post-Merge-Hook geschrieben, jetzt fügte ich meinem Hauptprojektordner ein "Hooks" -Verzeichnis hinzu (da git Änderungen in .git/hooks nicht nachverfolgt), habe ich irgendwo gelesen, dass ich aus Hooks einen symbolischen Link machen kann .git/hooks, damit ich die Datei nicht jedes Mal von einem Ordner in den anderen kopieren muss, wenn jemand sie ändert, also habe ich versucht:
ln -s -f hooks/post-merge .git/hooks/post-merge
Aber es scheint nicht zu funktionieren, irgendwelche Ideen warum? "ln hooks/post-merge .git/hooks/post-merge" funktioniert gut, aber das Erstellen eines harten Links ist das gleiche wie copyin, denke ich ....
sie haben gerade einen falschen Pfad verwendet, es sollte sein:
ln -s -f ../../hooks/post-merge .git/hooks/post-merge
Während Sie symbolische Links verwenden können, können Sie auch den Hooks-Ordner für Ihr Projekt in Ihren Git-Einstellungen ändern:
git config core.hooksPath hooks/
Dies ist standardmäßig lokal, sodass die Git-Haken für Ihre anderen Projekte nicht ruiniert werden. Es funktioniert für alle Hooks in diesem Repository, daher ist es besonders nützlich, wenn Sie mehr als einen Hook haben.
Wenn Sie bereits benutzerdefinierte Hooks in .git/hooks/
haben, die Sie nicht mit Ihrem Team teilen möchten, können Sie sie in hooks/hinzufügen und einen .gitignore
hinzufügen, damit sie nicht freigegeben werden.
Verzeichnis vor dem Linken ändern
cd /path/to/project-repo/.git/hooks
ln -s -f ../../hooks/post-merge ./post-merge
warum nicht einfach cp ./hooks/* .git/hooks /
das hat für mich in Mac OS funktioniert
Anhand des Kommentars von Michael Cihar folgt ein Beispiel für ein bash-Skript, das ich geschrieben habe, um diese Symlinks einfach zu erstellen. Dieses Skript befindet sich in git_hooks/dir, das sich im Projektstammverzeichnis befindet. Mein Ordner .git/befindet sich ebenfalls auf derselben Verzeichnisebene.
#!/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
Mein Skript muss aus dem aktuellen git_hooks/-Verzeichnis ausgeführt werden. Sie können es ändern, um sich anders zu verhalten, wenn Sie möchten.
Dieses Skript stellt eine Verknüpfung zu allen Dateien her, die nicht mit einer Dateierweiterung im Verzeichnis git_hooks/versehen sind. Ich habe eine README.txt in diesem Verzeichnis + dieses Skript (genannt symlink.sh). Alle eigentlichen Git-Hooks werden als "pre-commit", "pre-push" usw. bezeichnet, sodass sie mit einem Link verknüpft werden.
Die Pfadberechnung erfolgt relativ zum Symlink. Verstehen wir anhand eines Beispiels,ln -s path/to/file symlink/file
Hier sollte der Pfad zur Datei eigentlich der relative Pfad vom Symlink-Pfad sein.
Das System berechnet den Dateipfad tatsächlich als symlink/path/path/to/file
.__ Der obige Befehl sollte als neu geschrieben werden ln -s ../path/to/file symlink/path
Die Ordnerstruktur ist
/Code
------ symlink/file
------ Pfad/zu/Datei