Warum gibt git bei git add den Fehler „Assertion failed“ aus?
Lesezeit: 4 Minuten
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
Ich habe ein Git-Repo in ein anderes verschoben
löschte das .git-Verzeichnis und dachte, es würde ein normales Unterverzeichnis werden
versucht zu git add -A .
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
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.