Wie verfolge ich nicht verfolgte Inhalte?

159

Siehe unter der durchgezogenen Linie für meine ursprüngliche Frage.

Ich habe einen Ordner in meinem lokalen Verzeichnis, der nicht verfolgt wird. Wenn ich renne git status, bekomme ich:

Changed but not updated:
modified:   vendor/plugins/open_flash_chart_2 (modified content, untracked content)

Wenn ich tippe und es git add vendor/plugins/open_flash_chart_2dann git statuserneut versuche , wird immer noch "nicht verfolgt" angezeigt. Was ist los?


Hier ist eine einfache Zusammenfassung meiner letzten halben Stunde:

  • Es wurde festgestellt, dass mein Github-Repo mein vendor/plugins/open_flash_chart_2Plugin nicht verfolgt . Insbesondere gibt es keinen Inhalt und es wird ein grüner Pfeil auf dem Ordnersymbol angezeigt.

  • Versucht git submodule init

    No submodule mapping found in .gitmodules for path 'vendor/plugins/open_flash_chart_2'
    
  • Versucht git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

    vendor/plugins/open_flash_chart_2 already exists in the index
    
  • git status

    modified: vendor/plugins/open_flash_chart_2 (untracked content)
    
  • Ich habe nach einer Datei gesucht, die .gitmodulesin meinem Repository / lokalen Verzeichnis benannt ist, konnte aber keine finden.

Was muss ich tun, damit meine Submodule funktionieren, damit Git richtig mit dem Tracking beginnen kann?


Dies hängt möglicherweise nicht zusammen (ich füge es hinzu, falls es hilft), aber jedes Mal, wenn ich git commit -aanstelle meiner üblichen git commit -m "my comments"Eingabe tippe, wird ein Fehler ausgegeben:

E325: ATTENTION
Found a swap file by the name ".git\.COMMIT-EDITMSG.swp"
         dated: Thu Nov 11 19:45:05 2010
     file name: c:/san/project/.git/COMMIT_EDITMSG
      modified: YES
     user name: San   host name: San-PC
    process ID: 4268
While opening file ".git\COMMIT_EDITMSG"
         dated: Thu Nov 11 20:56:09 2010
  NEWER than swap file!  
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

Ich bin ein absoluter Neuling bei Github und obwohl ich versucht habe, die Dokumentation durchzugehen, bin ich ein bisschen ratlos über diese besonderen Probleme. Danke dir.

sscirrus
quelle
2
Ich bin über ein paar Dinge verwirrt. Erstens: Warum sagst du immer wieder Github? Alles, wovon du sprichst, klingt lokal (außer dem grünen Pfeil - darüber weiß ich nichts). Ist das richtig oder ist dies eine Frage zum Übertragen von Updates auf Github? Zweitens: Haben Sie tatsächlich etwas getan, um dieses Plugin als Submodul zu erstellen? Ein Submodul ist ein eigenständiges Git-Repository. Sie erstellen es separat und fügen es dann dem Superprojekt hinzu.
Cascabel
1
Hm, die Ausgabe des Git-Status deutet darauf hin, dass es dort tatsächlich ein Submodul gibt ... aber Sie haben wirklich keine .gitmodules-Datei? Wenn dieses Plugin ein eigenes Repo hat und Sie wissen, welche Version Sie möchten, können Sie dieses Verzeichnis einfach aus Ihrem Projekt entfernen, sicherstellen, dass in .gitmodules kein Eintrag vorhanden ist, und das Submodul-Setup durchgehen: git submodule add, git submodule update --init.
Cascabel
Jefromi - Ich habe Github nicht mehr als zweimal erwähnt - das erste Mal, weil der grüne Pfeil über dem gelben Ordnerbild im eigentlichen Github-Repository für open_flash_chart_2 angezeigt wird. Ich werde die Antwort gerne bearbeiten, um sie klarer zu machen.
sscirrus
1
@sscirrus: Du solltest definitiv eine Präferenz haben, Submodul oder nicht. Wenn dies eine externe Sache ist, an der Sie nicht arbeiten werden, von der Sie jedoch möglicherweise Updates wünschen, sollte es sich um ein Submodul handeln. Wenn es Ihnen nicht wichtig ist, Updates von seinem ursprünglichen Repo zu erhalten, und Sie die Quelle möglicherweise selbst hacken möchten, sollte es sich nicht um ein Submodul handeln.
Cascabel
1
Diese Frage scheint sich nur um Git-Submodule zu handeln. Ich habe einige Tags entfernt, da diese Frage nicht direkt mit Rails oder Github zusammenhängt. Sie würde für alle Git- Anwendungsfälle gelten. Und das trackingTag scheint für die Themen "Website-Besucher-Tracking" verwendet zu werden, sodass dies auch nicht zutreffen würde.
Edgerunner

Antworten:

239

Sie haben den vendor/plugins/open_flash_chart_2Eintrag "gitlink" hinzugefügt , ihn jedoch nie als Submodul definiert. Tatsächlich verwenden Sie die interne Funktion, die das Git-Submodul verwendet (Gitlink-Einträge), aber Sie verwenden nicht die Submodul-Funktion selbst.

Sie haben wahrscheinlich so etwas gemacht:

git clone git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
git add vendor/plugins/open_flash_chart_2

Dieser letzte Befehl ist das Problem. Das Verzeichnis vendor/plugins/open_flash_chart_2beginnt als unabhängiges Git-Repository. Normalerweise werden solche Unter-Repositorys ignoriert. Wenn Sie jedoch git add anweisen, es explizit hinzuzufügen, wird ein Gitlink-Eintrag erstellt, der auf das HEAD-Commit des Unter-Repositorys verweist, anstatt den Inhalt des Verzeichnisses hinzuzufügen. Es könnte schön sein, wenn git add sich weigern würde, solche „Semi-Submodule“ zu erstellen.

Normale Verzeichnisse werden in Git als Baumobjekte dargestellt. Baumobjekte geben den darin enthaltenen Objekten Namen und Berechtigungen (normalerweise andere Baum- und Blob-Objekte - Verzeichnisse bzw. Dateien). Submodule werden als "Gitlink" -Einträge dargestellt. Gitlink-Einträge enthalten nur den Objektnamen (Hash) des HEAD-Commits des Submoduls. Das „Quell-Repository“ für das Commit eines Gitlinks wird in der .gitmodulesDatei angegeben (und in der .git/configDatei, sobald das Submodul initialisiert wurde).

Was Sie haben, ist ein Eintrag, der auf ein bestimmtes Commit verweist, ohne das Quell-Repository für dieses Commit aufzuzeichnen. Sie können dies beheben, indem Sie Ihren Gitlink entweder zu einem geeigneten Submodul machen oder indem Sie den Gitlink entfernen und durch „normalen“ Inhalt (einfache Dateien und Verzeichnisse) ersetzen.

Verwandle es in ein richtiges Submodul

Das einzige Bit, das Sie vermissen, um es richtig vendor/plugins/open_flash_chart_2als Submodul zu definieren, ist eine .gitmodulesDatei. Normalerweise (wenn Sie es nicht bereits als nackten Gitlink-Eintrag hinzugefügt hätten) würden Sie einfach Folgendes verwenden git submodule add:

git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

Wie Sie festgestellt haben, funktioniert dies nicht, wenn der Pfad bereits im Index vorhanden ist. Die Lösung besteht darin, den Gitlink-Eintrag vorübergehend aus dem Index zu entfernen und dann das Submodul hinzuzufügen:

git rm --cached vendor/plugins/open_flash_chart_2
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

Dadurch wird Ihr vorhandenes Sub-Repository verwendet (dh das Quell-Repository wird nicht neu geklont) und eine .gitmodulesDatei bereitgestellt, die folgendermaßen aussieht:

[submodule "vendor/plugins/open_flash_chart_2"]
    path = vendor/plugins/open_flash_chart_2
    url = git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

Es wird auch ein ähnlicher Eintrag in Ihrem Haupt-Repository vorgenommen .git/config(ohne die pathEinstellung).

Wenn Sie dies festlegen, erhalten Sie ein geeignetes Submodul. Wenn Sie das Repository klonen (oder auf GitHub pushen und von dort klonen), sollten Sie in der Lage sein, das Submodul über neu zu initialisieren git submodule update --init.

Ersetzen Sie es durch einfachen Inhalt

Im nächsten Schritt wird davon ausgegangen, dass Ihr Sub-Repository in vendor/plugins/open_flash_chart_2keinen lokalen Verlauf hat, den Sie beibehalten möchten (dh alles, was Sie interessiert, ist der aktuelle Arbeitsbaum des Unter-Repositorys, nicht der Verlauf).

Wenn Sie einen lokalen Verlauf im Sub-Repository haben, den Sie interessieren, sollten Sie das .gitVerzeichnis des Sub-Repositorys sichern, bevor Sie es im zweiten Befehl unten löschen. ( Beachten Sie auch das folgende Beispiel für einen Git-Teilbaum , in dem der Verlauf des HEAD des Sub-Repositorys beibehalten wird.)

git rm --cached vendor/plugins/open_flash_chart_2
rm -rf vendor/plugins/open_flash_chart_2/.git # BACK THIS UP FIRST unless you are sure you have no local changes in it
git add vendor/plugins/open_flash_chart_2

Dieses Mal ist das Verzeichnis beim Hinzufügen kein Unter-Repository, daher werden die Dateien normal hinzugefügt. Da wir das .gitVerzeichnis gelöscht haben, gibt es leider keine einfache Möglichkeit, die Dinge mit dem Quell-Repository auf dem neuesten Stand zu halten.

Sie können stattdessen eine Teilbaumzusammenführung verwenden. Auf diese Weise können Sie problemlos Änderungen aus dem Quell-Repository übernehmen und gleichzeitig die Dateien in Ihrem Repository "flach" halten (keine Submodule). Der Befehl git subtree eines Drittanbieters ist ein netter Wrapper um die Funktion zum Zusammenführen von Teilbäumen.

git rm --cached vendor/plugins/open_flash_chart_2
git commit -m'converting to subtree; please stand by'
mv vendor/plugins/open_flash_chart_2 ../ofc2.local
git subtree add --prefix=vendor/plugins/open_flash_chart_2 ../ofc2.local HEAD
#rm -rf ../ofc2.local # if HEAD was the only tip with local history

Später:

git remote add ofc2 git://github.com/korin/open_flash_chart_2_plugin.git
git subtree pull --prefix=vendor/plugins/open_flash_chart_2 ofc2 master

git subtree push --prefix=vendor/plugins/open_flash_chart_2 [email protected]:me/my_ofc2_fork.git changes_for_pull_request

Der Git-Teilbaum verfügt auch über eine --squashOption, mit der Sie vermeiden können, den Verlauf des Quell-Repositorys in Ihren Verlauf aufzunehmen, aber dennoch Upstream-Änderungen übernehmen können.

Chris Johnsen
quelle
Chris, ich habe es gerade versucht rm -rf vendor/plugins/open_flash_chart_2/.gitund es heißt 'rm' wird nicht erkannt. Dann habe ich es versucht git rm -rf vendor/plugins/open_flash_chart_2/.gitund es stand fatal: pathspec 'vendor/plugins/open_flash_chart_2/.git' did not match any files(aber ich kann es im Windows Explorer erreichen!).
sscirrus
2
Wir haben das Problem im Chat ein wenig besprochen. Das OP konnte das Verzeichnis des Sub-Repositorys entfernen .gitund die Dateien "flach" erneut hinzufügen (die erste Option "Einfacher Inhalt").
Chris Johnsen
1
Das hat mir neulich so viel Arsch gerettet. Ich hatte versehentlich etwas mit einem .git-Verzeichnis zu meinem Git-Repo hinzugefügt, und dann dachte Git irgendwie, es hätte ein Submodul, was dazu führte, dass meine Git-SVN-Commits ausflippten. Ich würde dich 3 Mal positiv bewerten, wenn ich könnte.
Davidtbernal
Möchten Sie darauf hinweisen, dass das Plugin eines Drittanbieters subtreenicht mit dem Zusammenführen von Teilbäumen verwechselt werden darf. Es ist kein Wrapper. Autor sagt so: P
NebulaFox
@NebulaFox: Während der Git-Teilbaum nicht nur ein Wrapper für das Zusammenführen von Teilbäumen ist , verwendet er sicherlich die gleichen Techniken wie das Standardverfahren zum Zusammenführen von Teilbäumen (dh git readtree --prefix=pathund Zusammenführen von Teilbäumen: git mergemit -s subtreeoder-Xsubtree=path ). Es hat auch nette Extras "oben": --squashModus, splitBefehl und die pushund pullHelfer.
Chris Johnsen