419 Stimmen

Wie kann ich Git-Zweige archivieren?

Ich habe einige alte Zweige in meinem Git-Repository, an denen nicht mehr aktiv gearbeitet wird. Ich möchte die Zweige archivieren, damit sie nicht standardmäßig angezeigt werden, wenn ich git branch -l -r . Ich möchte sie nicht löschen, weil ich den Verlauf beibehalten möchte. Wie kann ich das tun?

Ich weiß, dass es möglich ist, einen Schiedsrichter außerhalb von refs/heads zu erstellen. Zum Beispiel, refs/archive/old_branch . Gibt es irgendwelche Konsequenzen, wenn man das tut?

3voto

Sridhar Sarnobat Punkte 21937

Mein Ansatz ist es, alle Zweige, die mich nicht interessieren, mit dem Präfix "trash_" umzubenennen und dann zu verwenden:

git branch | grep -v trash

(mit einer Shell-Tastenbindung)

Um die Färbung des aktiven Zweigs beizubehalten, müsste man:

git branch --color=always | grep --color=never --invert-match trash

1voto

Banezaka Punkte 21

Sie können ein Skript verwenden, das den Zweig für Sie archiviert

.

Es erstellt für Sie ein Tag mit dem Präfix archive/ und löscht dann den Zweig. Vergewissern Sie sich, dass Sie verstehen, was es tut, bevor Sie es benutzen =)


Verwendung - $/your/location/of/script/archbranch [branchname] [defaultbranch]

Wenn Sie das Skript ausführen möchten, ohne den Speicherort zu schreiben, fügen Sie es zu Ihrem Pfad hinzu

Dann können Sie es aufrufen durch

$ archbranch [branchname] [defaultbranch]

En [defaultbranch] ist der Zweig, in den er nach Abschluss der Archivierung wechselt. Es gibt einige Probleme mit der Farbcodierung, aber ansonsten funktioniert es. Ich verwende es schon seit langem in Projekten.

1voto

ya.teck Punkte 1672

In Git ist ein Branch nur ein Verweis auf einen Commit. Das Entfernen einer Verzweigung entfernt also nur einen Zeiger, nicht aber den zugehörigen Code, selbst wenn die Verzweigung nie zusammengeführt wurde. Das "Archivieren" eines lokalen Zweigs ist also so einfach wie das Merken des Zeigernamens (Commit-Hash). Sie finden diese Informationen in ./git/refs/heads Verzeichnis. Alternativ können Sie die Branch-to-Commit-Map auch einfach in eine Textdatei kopieren, wie folgt.

git branch -v > /path/to/backup/branches.txt

Sobald ein Zweig entfernt wurde, können Sie ihn mit dem folgenden Befehl lokal wiederherstellen.

git branch <branch_name> <commit_hash>

1voto

Trent Punkte 1

Um Zweige zu archivieren, die älter als n Monate oder Jahre sind, führen Sie dieses Bash-Skript aus.

#!/bin/bash

# Average days in a month - 30.436875
# Hours in a day 24
# Minutes in an hour 60
# Seconds in a minute 60
months_in_year=12
days_in_month=30.436875
hours_in_day=24
minutes_in_hour=60
seconds_in_minute=60

# Input is x months or x years
# $1 an integer
# $2 a time metric

# Name of the script, follows through simlinks
script_name="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"

if [ $# -le 1 ]; then
    echo "Usage: ./${script_name} [1-9] [month(s)/year(s)]"
    exit 1
fi

time_period=$1
time_metric=$2

if [[ ${time_metric} =~ "month" ]]; then minimum_branch_age_in_seconds=$( echo "scale=4; $time_period * $days_in_month * $hours_in_day * $minutes_in_hour * $seconds_in_minute" | bc); fi
if [[ ${time_metric} =~ "year" ]]; then minimum_branch_age_in_seconds=$( echo "scale=4; $time_period * $months_in_year * $days_in_month * $hours_in_day * $minutes_in_hour * $seconds_in_minute" | bc); fi

echo "minimum_branch_age: $1 $2"
echo "minimum_branch_age_in_seconds: ${minimum_branch_age_in_seconds%.*}"

git for-each-ref refs/remotes | while read commit type ref;do
    current=$(date +%s)
    headcd=$(git log -1 --pretty=%cd --date=format:%s ${commit})
    age_in_seconds=$((current-headcd))
    if [[ ${age_in_seconds} -ge ${minimum_branch_age_in_seconds%.*} ]];then
        branch=$(echo $ref | sed 's=refs/remotes/origin/==g')
        age_in_months=$( echo "scale=4; $age_in_seconds / $days_in_month / $hours_in_day / $minutes_in_hour / $seconds_in_minute" | bc)
        echo "archiving $branch - age in seconds - $age_in_seconds - age in months - $age_in_months "
        git tag archive/${branch} ${branch}
        git push -d origin ${branch}
        git branch -D ${branch}
        echo "Unarchive with: git checkout -b ${branch} archive/${branch}"
    fi
done

Danke an Jeremy für das Fleisch in diesem Eintopf.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X