Warum gibt git bei git add den Fehler „Assertion failed“ aus?

Lesezeit: 4 Minuten

Benutzer-Avatar
Benutzer26270

Ich habe ein Repo gegabelt und es dann auf meinen Mac in a geklont /YATC Verzeichnis. Ich hatte ein zuvor erstelltes Xcode-Projekt (TwitterTimeline) in einem anderen Verzeichnis, das ich in die kopiert habe /YATC directory. Ich tat git add . im /YATC-Verzeichnis, und dem Repo wurde nur ein leeres TwitterTimeline-Verzeichnis hinzugefügt. Es wurden keine weiteren Dateien hinzugefügt. Später fand ich heraus, dass es bereits eine gab .git Verzeichnis in der TwitterTimeline. Ich denke, Xcode muss das erstellt haben, obwohl ich mich nicht erinnern kann, dass ich jemals darum gebeten habe.

Jedenfalls habe ich die gelöscht TwitterTimeline/.git Verzeichnis. Ich ging zurück zu /YATC und versucht zu tun git add . da, und nichts ist passiert. Das heißt, ich habe es sofort getan git status, und es hieß, es gäbe nichts zu begehen. Dann ging ich zum TwitterTimeline-Verzeichnis und tat es git add .und bekam folgendes:

Assertion failed: (item->nowildcard_len <= item->len && item->prefix <= item->len), function prefix_pathspec, file pathspec.c, line 308.
Abort trap: 6

Was ist das?

Ich bin mir nicht sicher, was genau passiert, aber ich war in der gleichen Situation

  1. Ich habe ein Git-Repo in ein anderes verschoben
  2. löschte das .git-Verzeichnis und dachte, es würde ein normales Unterverzeichnis werden
  3. versucht zu git add -A .
  4. habe die komische fehlermeldung bekommen

Ich habe es umgangen, indem ich das Unterverzeichnis umbenannt habe git add aus einem übergeordneten Verzeichnis, dann Umbenennen des Unterverzeichnisses zurück in den ursprünglichen Namen. Irgendwie schien das Git wieder in einen funktionierenden Zustand zu versetzen.

  • In meinem Fall habe ich vergessen, dass das leere Verzeichnis, dem ich hinzugefügt habe, ein Untermodul ist (das nicht ausgeführt wurde git submodule update nach Klonen). Und wenn ich den Inhalt in einen leeren Ordner kopiert und versucht habe git add .ich habe den gleichen Fehler.

    – Dilawar

    4. November 2015 um 12:06 Uhr

Benutzer-Avatar
kenorb

Grundsätzlich ist das Problem bekannt und betrifft meist Submodule. Es ist kein Git-Bug, aber im Grunde sollten Sie, anstatt zu behaupten, den richtigen Fehler sehen, der spezifisch ist Pfadspez ist Teil des Submoduls.

Das folgende Git Patch von Stefan Beller behebt dieses Problem:

--- a/pathspec.c
+++ b/pathspec.c
@@ -313,8 +313,23 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
    }

    /* sanity checks, pathspec matchers assume these are sane */
-   assert(item->nowildcard_len <= item->len &&
-          item->prefix         <= item->len);
+   if (item->nowildcard_len > item->len ||
+       item->prefix         > item->len) {
+       /* Historically this always was a submodule issue */
+       for (i = 0; i < active_nr; i++) {
+           struct cache_entry *ce = active_cache[i];
+           int ce_len = ce_namelen(ce);
+           int len = ce_len < item->len ? ce_len : item->len;
+           if (!S_ISGITLINK(ce->ce_mode))
+               continue;
+           if (!memcmp(ce->name, item->match, len))
+               die (_("Pathspec '%s' is in submodule '%.*s'"),
+                   item->original, ce_len, ce->name);
+       }
+       /* The error is a new unknown bug */
+       die ("BUG: item->nowildcard_len > item->len || item->prefix > item->len)");
+   }
+
    return magic;
 }

Einer der Gründe könnte sein, dass das Verzeichnis, in dem Sie die Dateien hinzufügen, immer noch als Submodul im Index registriert ist, aber eigentlich kein gültiges Git-Repository ist (z. B. es fehlt .git Verzeichnis).

Sie sollten also entweder:

  • Initialisieren und aktualisieren Sie Ihre Submodule durch:

     git submodule init
     git submodule update
    

    Führen Sie aus dem übergeordneten Verzeichnis aus, in dem der Fehler aufgetreten ist.

    Stellen Sie sicher, dass alle nicht initialisierten Submodule leere Verzeichnisse haben, verschieben Sie also alle Dateien vorübergehend aus diesen Verzeichnissen.

  • oder wenn Sie dieses Submodul nicht benötigen, entfernen Sie es:

    git rm -f --cached subrepo
    

    Führen Sie aus dem übergeordneten Verzeichnis aus, in dem der Fehler aufgetreten ist.

Versuchen Sie dann erneut, die Dateien hinzuzufügen.


Siehe auch:

Ich habe dieses Problem auch, hier ist mein Weg, dies zu beheben:

  1. Löschen Sie den .git-Ordner im Submodul-Ordner (wenn Sie dies zuvor getan haben, gehen Sie zu 2)
  2. Führen Sie dann den Befehl follow aus, das Verzeichnis ist Ihr Submodulordner

    git rm --cached directory
    git add directory
  3. dann können Sie diesen Ordner wie andere hochladen

Nur so konnte ich diesen Fehler umgehen, danach

war, das Verzeichnis umzubenennen und es dann erneut hinzuzufügen.

1144500cookie-checkWarum gibt git bei git add den Fehler „Assertion failed“ aus?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy