2016-05-17 25 views
0

Ich habe meine Svn-Repository zu git migriert, aber aus irgendeinem Grund gibt es immer noch Stammordner, was nicht der Fall sein sollte. Ich möchte diese Ordner entfernen, ohne die Verlaufszeile zu beschädigen.Git Filter-Zweig zu Stammordner zu entfernen

Dies ist das Git Repository ich im Moment haben:

- My repository 
    -- Project1 
    --- trunk 
     ---- src 
     ---- somefile.txt 
     ---- someotherfile.cpp 
     ---- andanotherfile.cpp 

und das ist, was ich haben will:

- My repository 
    -- Project1 
    --- src 
    --- somefile.txt 
    --- someotherfile.cpp 
    --- andanotherfile.cpp 

ich, dass der Befehl Filter-Zweig kennen gelernt haben verwendet wird Dafür konnte ich jedoch kein Beispiel finden, das zu meinem Fall passt, abgesehen von this und this, aber selbst da fühlte ich mich etwas verwirrt und nicht sicher, ob ich es versuchen sollte oder nicht. Wer ist auf etwas Ähnliches gestoßen und kann bestätigen, dass das die Lösungen sind?

Vielen Dank im Voraus.

Update: Also habe ich zu wissen, dass der folgende Befehl die meiste Zeit verwendet wird, um die Tat zu tun:

git filter-branch --index-filter \ 
    'git ls-files -s | sed "s-/trunk/-/-" | 
     GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
      git update-index --index-info && 
    mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD 

in der Tat, überprüfte ich die sed Linie und es tut mir sagen, dass es würde entferne den Kofferraum und bewege alles, was darin ist, in das obere Verzeichnis. Die Ausführung gibt und Fehler von:

../myrepository/.git-rewrite/t/../index.new': No such file or directory 

Ich weiß nicht, warum ich diesen Fehler bekomme. Ich habe nachgeschlagen und es scheint, ich brauche eine Ergänzung zu diesem Befehl, eine Nummer vor der HEAD, wie 83df928c..HEAD. Allerdings weiß ich nicht, wofür (ich meine, Revisionsnummer, wahrscheinlich, aber warum?) Oder was meins ist. Würde mich über Hilfe freuen. Hätte es beinahe gehabt!

Antwort

0

So zu haben, hier geht es.

Der Befehl, der die Magie tut, ist:

git filter-branch -f --index-filter \ 
    'git ls-files -s | sed "s-/trunk/-/-" | 
      GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
      git update-index --index-info && 
    mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' af117ec86a30ba6676571cd1f73083c5cfbec0bd..HEAD 

Notiz der Tag begehen, bevor ..HEAD, die entweder Sekunde sein sollte oder dritte frühestens begehen Tag, den Sie eingeben sollten. Wenn Sie die erste eingeben, erhalten Sie eine Fehlermeldung.

Um das begehen Tag der frühesten begehen herauszufinden, verwenden Sie einfach:

git log 

und blättern so viel nach unten wie möglich, dort werden Sie die frühesten Commits sehen. Nimm den zweiten oder dritten. Es ist fertig.

0

Klon ein anderes Repo einen Test

git filter-branch --tree-filter 'cd Project1;cp trunk/* ./; rm -rf trunk' 
+0

Sind Sie sich dieses Befehls sicher? Es gibt einen Fehler für mich, sagen, dass "cd: kann nicht zu Project1" und folgende 'cp: can not stat trunk/* ': Keine solche Datei oder Verzeichnis', resultierend mit '/ usr/lib/git-core/git -filter-branch: 361:/usr/lib/git-core/git-filter-branch: kann nicht geöffnet werden ../commit: Keine solche Datei' und '../map/f4a19a767a46968b29e129c6d811b1cd3bd56eec: Verzeichnis nicht existent konnte nicht geschriebenen Commit schreiben . –

+0

es scheint, dass trunk ist eine funktion von svn? Sorry, ich weiß wenig über SVN. Wie ist die Geschichte? Wie auch immer, du könntest das Repo sichern und jede mögliche Methode ausprobieren. – ElpieKay

+1

So wurde der Project1-Ordner aus dem Root-Commit nicht in den Repo hinzugefügt.Beim Umschreiben dieser Commits, die Project1 nicht enthalten, würden cd, cp und rm fehlschlagen. Ich werde mehr Tests machen. – ElpieKay