web-dev-qa-db-de.com

Symbolischer Link zu einem Haken in git

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 ....

65
Mateusz Dymczyk

sie haben gerade einen falschen Pfad verwendet, es sollte sein:

ln -s -f ../../hooks/post-merge .git/hooks/post-merge
139
Michal Čihař

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.

4

Verzeichnis vor dem Linken ändern

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

warum nicht einfach cp ./hooks/* .git/hooks /

das hat für mich in Mac OS funktioniert

0
Frazko

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.

0
cchoe1

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

0
swayamraina