900 Stimmen

Den aktuellen Commit zum einzigen (ersten) Commit in einem Git-Repository machen?

Ich habe derzeit ein lokales Git-Repository, das ich in ein Github-Repository verschiebe.

Das lokale Repository hat ~10 Commits, und das Github-Repository ist ein synchronisiertes Duplikat davon.

Ich möchte den gesamten Versionsverlauf aus dem lokalen Git-Repository entfernen, so dass der aktuelle Inhalt des Repositorys als einzige Übergabe erscheint (und daher ältere Versionen von Dateien innerhalb des Repositorys nicht gespeichert werden).

Ich würde diese Änderungen dann gerne auf Github veröffentlichen.

Ich habe Git rebase untersucht, aber das scheint eher geeignet zu sein, bestimmte Versionen zu entfernen. Eine andere mögliche Lösung besteht darin, das lokale Projektarchiv zu löschen und ein neues zu erstellen - allerdings würde dies wahrscheinlich eine Menge Arbeit verursachen!

ETA: Es gibt bestimmte Verzeichnisse/Dateien, die nicht aufgespürt werden - wenn möglich, würde ich gerne die Aufspürung dieser Dateien beibehalten.

4voto

jthill Punkte 47948

git filter-branch ist das wichtigste chirurgische Instrument.

git filter-branch --parent-filter true -- @^!

--parent-filter holt die Eltern auf stdin und sollte die umgeschriebenen Eltern auf stdout ausgeben; unix true wird erfolgreich beendet und gibt nichts aus, also: keine Eltern. @^! es Git-Abkürzung für "Der Kopf verpflichtet sich, aber keiner seiner Elternteile". Löschen Sie dann alle anderen Referenzen und pushen Sie nach Belieben.

3voto

Kapilrc Punkte 1090

Hier sind die Schritte, um den Verlauf eines Github-Repositorys zu löschen

Entfernen Sie zunächst den Verlauf aus .git

rm -rf .git

Erstellen Sie nun die Git-Repos nur mit dem aktuellen Inhalt neu

git init
git add .
git commit -m "Initial commit"

Push zu den Github-Remote-Repos, um sicherzustellen, dass Sie die Historie überschreiben

git remote add origin git@github.com:<YOUR ACCOUNT>/<YOUR REPOS>.git
git push -u --force origin master

2voto

Zibri Punkte 7918

Hier ist es:

#!/bin/bash
#
# By Zibri (2019)
#
# Usage: gitclean username password giturl
#
gitclean () 
{ 
    odir=$PWD;
    if [ "$#" -ne 3 ]; then
        echo "Usage: gitclean username password giturl";
        return 1;
    fi;
    temp=$(mktemp -d 2>/dev/null /dev/shm/git.XXX || mktemp -d 2>/dev/null /tmp/git.XXX);
    cd "$temp";
    url=$(echo "$3" |sed -e "s/[^/]*\/\/\([^@]*@\)\?\.*/\1/");
    git clone "https://$1:$2@$url" && { 
        cd *;
        for BR in "$(git branch|tr " " "\n"|grep -v '*')";
        do
            echo working on branch $BR;
            git checkout $BR;
            git checkout --orphan $(basename "$temp"|tr -d .);
            git add -A;
            git commit -m "Initial Commit" && { 
                git branch -D $BR;
                git branch -m $BR;
                git push -f origin $BR;
                git gc --aggressive --prune=all
            };
        done
    };
    cd $odir;
    rm -rf "$temp"
}

Ebenfalls hier untergebracht: https://gist.github.com/Zibri/76614988478a076bbe105545a16ee743

2voto

Sam Watkins Punkte 7162

Die unten beschriebene Methode ist exakt reproduzierbar, so dass es nicht nötig ist, den Klon erneut auszuführen, wenn beide Seiten konsistent waren, führen Sie das Skript einfach auch auf der anderen Seite aus.

git log -n1 --format=%H >.git/info/grafts
git filter-branch -f
rm .git/info/grafts

Wenn Sie es dann bereinigen wollen, versuchen Sie dieses Skript:

http://sam.nipl.net/b/git-gc-all-ferocious

Ich habe ein Skript geschrieben, das die Historie für jeden Zweig des Repositorys "tötet":

http://sam.nipl.net/b/git-kill-history

siehe auch: http://sam.nipl.net/b/confirm

-1voto

JB Lovell Punkte 88

Ich habe ein ähnliches Problem gelöst, indem ich einfach die .git Ordner aus meinem Projekt zu entfernen und die Versionskontrolle über IntelliJ wieder einzubinden. Anmerkung: Die .git ist ausgeblendet. Sie können ihn im Terminal anzeigen mit ls -a und entfernen Sie es dann mit rm -rf .git .

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