Git: fatal: Pathspec befindet sich im Submodul

145

Ich versuche, TravisCI dazu zu bringen, meine statische Hakyll-Site gemäß diesem Handbuch automatisch bereitzustellen .

So wird mein Repo eingerichtet. Ich habe meinen Quellzweig, der meine Hkyll- und Markdown-Dateien enthält. Es baut das HTML in das _siteVerzeichnis ein, das als Submodul eingerichtet ist und mit meinem masterZweig verknüpft ist .

Ich baue die Site ohne Probleme und dann cdin das Verzeichnis _site. Wenn ich jedoch versuche, git add ./*die neu generierten HTML-Dateien zu verwenden, wird folgende Fehlermeldung angezeigt:

fatal: Pathspec './about.html' is in submodule '_site'

Wenn ich es versuche git add --all, erhalte ich folgende Fehlermeldung:

git: pathspec.c:317: prefix_pathspec: Assertion `item->nowildcard_len <= item->len && item->prefix <= item->len' failed.

/home/travis/build.sh: line 245: 1566 Aborted git add --all

Was verursacht das und wie kann ich das vermeiden?

Sie können das Repository hier anzeigen .

jmite
quelle

Antworten:

430

Das Entfernen des Verzeichnisses aus git und das erneute Hinzufügen funktionierte für mich:

 git rm --cached directory
 git add directory

Dies funktioniert, wenn Sie das .gitVerzeichnis absichtlich entfernt haben, weil Sie directoryes Ihrem Haupt-Git-Projekt hinzufügen möchten. In meinem speziellen Fall hatte ich eine Erweiterung geklont und lief, git add .ohne zu viel nachzudenken. Git hat beschlossen, ein Submodul zu erstellen, das mir nicht gefallen hat. Also entfernte ich mich directory/.gitund rannte hinein Git: fatal: Pathspec is in submodule. Ich konnte nicht herausfinden, wie ich das Submodul-Zeug entfernen kann. Mit den beiden obigen Zeilen behoben.

kqw
quelle
8
Dies löste ein Problem, bei dem ich versehentlich ein Projekt in ein vorhandenes Projekt heruntergezogen und ein Submodul erstellt hatte. Ich hatte fast jeden anderen Vorschlag da draußen ausprobiert. Das Entfernen des Verzeichnisses und das erneute Hinzufügen haben mein Problem behoben. Vielen Dank.
RevNoah
Ich habe .git und sehe es! Aber wenn ich einige Dateien festschreiben möchte, die sich in einem Ordner befinden, wird der Fehler "blahblah hat keine mit git bekannten Dateien gefunden" angezeigt
Dr.jacky
Dies hat das Problem behoben. In meinem Fall habe ich das Projekt auf einem anderen Computer geklont.
AntonIva
Ich hatte das gleiche Problem mit einem Visual Studio-Projekt, das ich mit GitHub synchronisiere. Der Ordner, in dem der größte Teil meiner Entwicklung stattfindet, wurde nicht verfolgt, und wenn ich versuchte, ihn hinzuzufügen, wurde der gleiche Fehler angezeigt. Diese Lösung hat es auch für mich behoben!
JohnRDOrazio
10

Es scheint , der git addKontext ist die Mutter Repo ( „parent“ bedeutet das eine mit dem Modul), der die Warnung auslöst.

Versuchen Sie, den Kontext zu ändern mit:

cd _site
git --git-dir=.git --work-tree=. add . 
git --git-dir=.git --work-tree=. commit -m "new files"

Vergessen Sie nicht, dass Sie, wenn dies funktioniert, immer noch zum übergeordneten Repo git add _sitezurückkehren müssten , und da sich das Subrepo ändern würde.

Und Sie müssten beide pushen.


Update Januar 2017 (2+ Jahre später)

Mit Git 2.12 werden Sie das nicht prefix_pathspec: Assertionmehr sehen.

Siehe Commit 2d81c48 (09. Januar 2017) von Stefan Beller ( stefanbeller) .
Unterstützt von: Jeff King ( peff) und Junio ​​C Hamano ( gitster) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 00880a1 , 18. Januar 2017)

pathspec: Bessere Meldung für submodulbezogene pathspecFehler

Das Ausführen von " git add a/b" wenn " a" ist ein korrekt fehlerhaftes Submodul, jedoch ohne eine aussagekräftige Fehlermeldung.

VonC
quelle
Ich bekomme error: unknown option git-dir = .git'`. Außerdem kann ich mein Eltern-Repo nicht aus Travis heraus
festschreiben
@jmite Ich habe die Antwort korrigiert: Die --git-dirund --work-treesind Optionen des gitBefehls, nicht des git addBefehls. Versuchen Sie zumindest das git addTeil, wenn das git commitnicht praktikabel ist.
VonC
Dies scheint etwas für mich zu brechen, aber ich konnte hier die Lösung finden
CGTheLegend
4

Mein Problem scheint zu sein, dass ich versehentlich den .gitOrdner des Submoduls gelöscht habe .

jmite
quelle
1
Ich habe genau das gleiche Problem. Können Sie uns mitteilen, wie Sie es gelöst haben?
Matt
Ich habe es gelöst, indem ich mein Skript so geändert habe, dass der .git-Ordner nicht gelöscht wird. Daher würde ich empfehlen, dass Sie Ihr Skript überprüfen, um festzustellen, ob sich tatsächlich ein .git-Ordner im Verzeichnis befindet.
Jmite
1
Ich tue es, aber ich möchte es loswerden, da Remote Repo nicht mehr existiert. Es ist für uns nur einfacher, den Quellcode so einzuschließen, wie er ist.
Matt
Dann ist es am besten, die Remote-Repos zu ändern. Schauen Sie sich den git remoteBefehl an.
Jmite
3

Es hört sich so an, als würden Sie mit nicht initialisierten Submodulen arbeiten (ihnen fehlen im Grunde .gitVerzeichnisse). Daher sollten Sie sie zuerst initialisieren und aktualisieren:

git submodule init
git submodule update

Wenn Sie dieses Submodul nicht mehr benötigen, entfernen Sie es durch:

git submodule deinit _site

oder:

git rm -f --cached _site

und füge es noch einmal hinzu:

git add _site

Überprüfen Sie Ihre aktuell ausstehenden Submodule durch : git submodule status.

Siehe auch: Warum ist ein Git-Fehler mit 'Assertion failed' bei git add.?

Kenorb
quelle
1

100% ige Behebung dieses Problems, auch wenn Sie mehr als ein Submodulverzeichnis im Projekt haben:

> git submodule foreach --recursive deinit -f --all -- <relative path>
> git add --all -f
John Smit Conor
quelle