Wie kopiere ich Commits von einem Git-Repo auf ein anderes?

96

Letzte Woche habe ich ein Github-Repo erstellt und vergessen, eine Lizenz für das Repo auszuwählen. Jetzt gibt es bereits 3 große Commits.

Ich habe die 3 Mitwirkenden gefragt, ob es in Ordnung ist, ob ich das Repo lösche und es dann erneut mit demselben Namen erstelle und diesmal die Lizenz beim Erstellen des Repos auswähle, und sie waren in Ordnung, was das ist.

Frage

Gibt es eine Möglichkeit, die Commits in ein neues Repo zu übertragen (diesmal ist das erste Commit die LIZENZ-Datei) und trotzdem die Commit-Metainformationen beizubehalten?

Jasmine Lognnes
quelle
1
Sie können dem ursprünglichen Repo weiterhin eine Lizenz hinzufügen. Weitere Informationen finden Sie unter help.github.com/articles/open-source-licensing/… .
Edwinksl

Antworten:

157

Gibt es eine Möglichkeit, die Commits in ein neues Repo zu übertragen (diesmal ist das erste Commit die LIZENZ-Datei) und trotzdem die Commit-Metainformationen beizubehalten?

Ja, indem Sie eine Fernbedienung hinzufügen und die Commits zusätzlich zu Ihrem ersten Commit auswählen.

# add the old repo as a remote repository 
git remote add oldrepo https://github.com/path/to/oldrepo

# get the old repo commits
git remote update

# examine the whole tree
git log --all --oneline --graph --decorate

# copy (cherry-pick) the commits from the old repo into your new local one
git cherry-pick sha-of-commit-one
git cherry-pick sha-of-commit-two
git cherry-pick sha-of-commit-three

# check your local repo is correct
git log

# send your new tree (repo state) to github
git push origin master

# remove the now-unneeded reference to oldrepo
git remote remove oldrepo

Der Rest dieser Antwort ist, wenn Sie die LIZENZ noch zu Ihrem vorherigen Repo hinzufügen möchten.

Ja. Sie können Ihr LICENSE-Commit als erstes Commit durch erneutes Basieren platzieren.

Das erneute Basieren ist eine Möglichkeit, die Festschreibungsreihenfolge neu zu ordnen, während alle Festschreibungsautoren und Festschreibungsdaten intakt bleiben.

Wenn Sie an einem gemeinsamen Repo arbeiten, wird generell davon abgeraten, es sei denn, Ihr gesamtes Team spricht fließend. Für diejenigen, die dies nicht tun, können sie einfach eine neue Kopie des Repositorys klonen.

So erhalten Sie Ihr LIZENZ-Commit als erstes Commit.

1. Aktualisieren Sie Ihre lokale Kopie und setzen Sie sie neu ein

Überprüfen Sie Ihr Projekt und platzieren Sie die LICENSE-Datei in einem Commit ON TOP Ihres aktuellen 3-Commit-Stacks.

#create LICENSE file, edit, add content, save
git add LICENSE
git commit -m 'Initial commit'

Führen Sie dann eine interaktive Rebase im Hauptzweig durch, um die Commits neu zu ordnen .

git rebase -i --root

Es wird ein Editor geöffnet. Verschieben Sie die unterste Zeile (Ihr Commit "Initial Commit", das letzte Commit) an den Anfang der Datei. Speichern Sie dann den Editor und beenden Sie ihn.

Sobald Sie den Editor verlassen, schreibt git die Commits in der gerade angegebenen Reihenfolge.

Sie haben jetzt Ihre lokale Kopie des Repositorys aktualisiert. machen:

git log

verifizieren.

2. Drücken Sie Ihren neuen Repo-Status auf Github

Nachdem Ihre Kopie aktualisiert wurde, müssen Sie sie zwangsweise auf Github verschieben.

git push -f origin master

Dadurch wird github angewiesen, den Hauptzweig an seinen neuen Speicherort zu verschieben. Sie sollten Push nur in seltenen Fällen erzwingen, in denen jeder, der damit arbeitet, über die anstehenden Änderungen informiert ist. Andernfalls werden Ihre Mitarbeiter verwirrt.

3. Synchronisieren Sie Mitarbeiter mit Github

Zuletzt müssen alle Mitarbeiter mit diesem Repository synchronisieren.

Zunächst müssen sie über saubere Repositorys verfügen, da der folgende Befehl bei nicht gespeicherten Änderungen destruktiv sein kann.

# make sure there are no unsaved changes
git status 

# pull the latest version from github
git fetch  

# move their master branch pointer to the one you published to github.
git reset --hard origin/master

Das ist es. Jeder sollte jetzt synchron sein.

Moocowmoo
quelle
1
Gute Antwort! Vielen Dank!
Kyrol
Viel Zeit gespart. Vielen Dank!
an0nh4x0r
9

Ich hatte ein ähnliches Problem, bei dem ich vergaß, meinem Github ein Repo zu geben, und mehrere Commits hinzufügte, bevor ich meinen Fehler bemerkte.

Ich habe eine ziemlich einfache Lösung gefunden.

Entfernen Sie zuerst die Fernbedienung zum ursprünglichen Repo

git remote remove origin

Zweitens fügen Sie der neuen Gabel auf meinem Github eine Fernbedienung hinzu

git remote add origin <my repo URL>

Dann schob ich mich zum Ursprungsmeister und alle meine Commits tauchten auf meinem Github auf.

Russ Bain
quelle
1
Nur um das noch zu ergänzen, musste ich es tun, als ich drückte git push --set-upstream origin master, aber Git macht dich darauf aufmerksam.
MRichards
tolle und einfache Lösung!
Mecograph
3
  • Ziel Git = UrlD (vorhandener Inhalt spielt keine Rolle)
  • SourceGit = UrlS

    git clone UrlS
    
    git remote add origin2 UrlD
    
    git push -f origin2 master
    

Jetzt hat das Ziel die gleichen Daten wie die Quelle (Sie können auch origin anstelle von origin2 verwenden).

Blaue Wolken
quelle