2009-12-09 2 views
7

Angenommen, ich habe eine Datei "ChangeLog" in Zweig "Master". Ich möchte Informationen über alle Änderungen in jedem Zweig in dieser Datei aufzeichnen (genauer als in einer Commit-Nachricht und mit anderen beschreibenden Informationen).GIT - wie man eine Datei über alle Zweige hinweg gemeinsam verwendet

I git checkout -b revA, Bearbeitungen durchführen, ChangeLog und git commit aktualisieren.

ich dann git checkout -b master. Dieser Checkout ersetzt ChangeLog durch die Version im Zweig "master".

Was ich möchte, ist für ChangeLog automatisch die zuletzt geänderte Version unabhängig von von welcher Zweig ich ausgecheckt habe. Ich möchte nicht ChangeLog von einem anderen Zweig in meinen aktuellen Zweig manuell zusammenführen (oder, wahrscheinlich, zu vergessen, zu verbinden).

Ich habe nichts gefunden, was dies zu ermöglichen scheint. Ist es möglich, dies zu tun?

Antwort

8

Sie einen Post-Kasse Haken verwenden:

#!/bin/sh 

newref="$2" 
isbranch="$3" 

# ignore file checkouts 
if test $isbranch -eq 0; then 
    exit 0 
fi 

path=ChangeLog 

git for-each-ref --sort=-committerdate \ 
       --format='%(objectname) %(refname:short)' \ 
       refs/heads/\* | 
while read sha ref; do 
    if git rev-parse --verify --quiet "$sha:$path" >/dev/null 
    then 
    if test "$newref" != "$sha"; then 
     echo Checking out $path from $ref 
     git checkout $sha -- "$path" 
    fi 
    break 
    fi 
done 

Es wird noch an Ihnen, die ChangeLog auf Ihrem Zweig hinzuzufügen und zu begehen, falls angemessen.

Dieser Hook sortiert Zweige nach den entsprechenden Commit-Daten ihres Kopfes, was problematisch sein könnte. Nehmen wir an, Sie erstellen einen Themenzweig, der auf einem Commit im Verlauf des Masters basiert. Obwohl der Snapshot ChangeLog im Sinne der Kalenderzeit älter ist, wird der Hook oben als neuestes behandelt, da es durch ein Commit referenziert wird, das vor Kurzem erstellt wurde, so dass Sie nicht versehentlich verlieren durch Umschalten der Zweige, wenn Sie nicht auf Änderungen haben ChangeLog.

+0

Das ist genau das, was ich will. Du schaukelst! Ich bin in der Lage, eine Datei zu haben, die beschreibt, was meine Zweige enthalten und (auf hohem Niveau), welche Änderungen sie beinhalten. – themis

+0

Gern geschehen! Ich bin froh, dass es hilft. –

3

Legen Sie es in ein separates Repository und verwenden Sie eine submodule, um es in jeden Zweig zu verknüpfen.

2

Schreiben Sie einen Post-Commit-Hook, um die Datei in die anderen Zweige zu integrieren. http://kernel.org/pub/software/scm/git/docs/githooks.html

+0

Das wird funktionieren und beantwortet die Frage, also gebe ich widerwillig es +1, aber das ist eine wirklich schlechte Idee. Dies bedeutet, dass der ChangeLog für Ihre neueste Version möglicherweise Informationen zu Änderungen enthält, die nicht veröffentlicht wurden. Warum willst du das? –

+0

Ich würde es nicht tun, aber die Frage zeigt die Situation, die Sie beschäftigen. Ich würde lieber explizit verzweigen und zusammenführen. –

+0

@William - die zu speichernde ChangeLog-Information ist für die Freigabe akzeptabel. – themis

7

Ich weiß, dass diese Antwort die Frage anbettelt, aber ich denke, dass alles andere sich für einen Maintenance-Kopfschmerz aufrichtet.

Wenn Sie eine ausreichende Beschreibung in Ihre Commit-Nachrichten eingeben, dann entspricht git log der Anforderung. Alle Änderungen, die sich in einem bestimmten Zweig befinden, werden genau durch die Commits beschrieben, die darin enthalten sind, und es ist unmöglich, dass sie veraltet sind oder Beschreibungen für Änderungen enthalten, die nicht in diesem Zweig enthalten sind.

Seit ich auf Git umgestiegen bin, habe ich aufgegeben, ein Änderungsprotokoll manuell zu verwalten. Für mich hatte es keinen Wert und keine signifikanten Kosten.

Es gibt keinen Grund, keine vollständigen Beschreibungen in die Commits zu schreiben. Mit --amend können Sie Rechtschreibfehler beheben und Details hinzufügen, und wenn Sie sich an die Konvention halten, eine kurze Betreffzeile und eine ausführlichere Beschreibung zu haben, dann können Sie zwischen kurzen und langen Protokollformaten wählen.

+0

Der ChangeLog befindet sich auf einer höheren Ebene als git log und zeigt an, um was es bei einem bestimmten Zweig geht und andere Informationen, die sich schwerer aus der massiven git log-Ausgabe herauslesen lassen. – themis

+1

@themis: Kommt das darauf an, was du in deine Commit-Nachricht geschrieben hast? In Ihrer Frage sagten Sie "genauer als in einer Commit-Nachricht", aber jetzt sagen Sie "auf einer höheren Ebene". Sind diese kompatibel? –

Verwandte Themen