Warum erlaubt Git Ihnen, sich auf einen losgelösten Kopf festzulegen? Gibt es Vorab-Hooks, die es deaktivieren können? Was ist der Zweck? Viele neue Entwickler tun dies und ich würde gerne eine Möglichkeit finden, es zu deaktivieren.So verhindern Sie das Festschreiben in einem abgekoppelten HEAD
Antwort
Dies kann nur durch eine lokale Git pre-commit
Hook verhindert werden, so dass Entwickler es erstellen müssten. Fügen Sie die your-local-project/.git/hooks/pre-commit
-Datei mit folgendem Inhalt:
#!/bin/sh
if ! git symbolic-ref HEAD &> /dev/null; then
echo "You are in a detached head state! Commit has been blocked. (Use --no-verify to bypass this check.)"
exit 1
fi
Stellen Sie sicher, es ausführbar ist. Credits go to svachalek
Warum sollte Git verhindern, in abgekoppelten HEAD zu commitieren? Detached HEAD bedeutet nur, dass es keinen Zeiger auf den Repository-Status gibt, an dem Sie arbeiten. Es setzt voraus, dass Sie wissen, was Sie tun.
Ich würde lieber untersuchen, warum viele Entwickler in Ihrem Team diesen Zustand eingeben? Vielleicht wenden sie irgendeinen seltsamen worklow an?
git checkout $commit-sha1
kann zu einem abgetrennten HEAD führen. So auch git checkout FETCH_HEAD
. Ein abgetrennter HEAD könnte als ein Zweig ohne Namen betrachtet werden. Wenn es Sie nicht verwirrt, könnten Sie es einfach ignorieren. Wie @fracz gesagt hat, könntest du es durch pre-commit
verhindern. Sie könnten es auch eine Verzweigung mit einem Namen mit git checkout -b some_name
machen. Ein post-checkout
Hook kann Ihnen helfen, den abgetrennten HEAD-Zustand zu erkennen und zu einem Zweig zu machen.
+1 für die Idee der Branch-Erstellung in der Post-Checkout-Hook. Es müsste jedoch Zweige mit zufälligen Namen erstellen, die wiederum im Laufe der Zeit ein großes Durcheinander verursachen würden. – fracz
@fracz Ja, zufälliger Name der Filiale ist in der Tat ein Problem. Wir könnten einige Logik verwenden, um einen richtigen Namen zu finden, aber im Gegensatz dazu ist es immer noch ein bisschen mühsam. Also ignoriere es einfach oder finde die Ursache und verhindere es im Voraus. Wie ich weiß, kann "Reposynchronisation" ohne "Repo-Start" auch zu einem getrennten HEAD-Zustand führen, wenn Repo verwendet wird. – ElpieKay
Das Erstellen der Verzweigung im 'post-commit'-Hook würde das Erstellen von Verzweigungen vermeiden, wenn der Benutzer eigentlich nichts festlegen möchte. Siehe https://gist.github.com/ben-cohen/316f89c763e9d8a027335261a44c4954 –
Git verwendet dies intern für viele Operationen. Der abgetrennte HEAD-Modus bringt Sie einfach in den (einen, einzelnen, speziellen) anonymen Zweig, und der anonyme Zweig kann später benannt werden.
Dies ist zum Beispiel, wie git rebase
es schafft, die Commits von ihrer ursprünglichen Kette zu einer neuen Kette zu kopieren. Zuerst wird das 10 Target-Commit (--onto
Standardwerte zu <upstream>
) mit diesem abgekoppelten HEAD-Modus überprüft. Dann kopiert es für jeden Commit, der kopiert werden soll, dieses Commit (mit git cherry-pick
oder etwas Äquivalent: die Details variieren je nach interaktiver vs nicht-interaktiver Rebase und wenn interaktiv, viele weitere Details). Zuletzt verschiebt es das vorhandene Zweig-Label, sodass es auf das endgültig kopierte Commit verweist.
Während dies die Bindung an den gelösten Kopf verhindert, wird es auch (interaktive) Rebase-Operationen stören. Intern verwendet rebase separate Köpfe, um die Commits wiederzugeben. – ad22
Das Zulassen von Rebases würde [das Auffinden von Rebases] (http://stackoverflow.com/questions/3921409/how-to-know-if-there-is-a-git-rebase-in-progress) im Hook erfordern. Allerdings kann ich mir kaum einen Entwickler vorstellen, der interaktiv rebase macht und gleichzeitig Angst davor hat, in abgekoppelter HEAD zu committen. – fracz