2016-05-17 19 views

Antwort

3

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?

+1

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

+1

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

1

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.

+0

+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

+0

@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

+0

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 –

0

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.