Ich habe ein Git-Superprojekt, das auf mehrere Submodule verweist, und ich versuche, einen Workflow zu sperren, damit der Rest meiner Projektmitglieder darin arbeiten kann.
Nehmen wir für diese Frage an, mein Superprojekt wird aufgerufen supery
und das Submodul wird aufgerufen subby
. (Dann ist eine Vereinfachung dessen, was ich versuche ... Ich verwende die Zweige nicht für Versionen, aber ich dachte, es wäre am einfachsten, sie als Frage zu formulieren.)
In meinem Hauptzweig von supery
wird das Tag v1.0
des Git-Projekts subby
als Submodul bezeichnet. Der Zweig von hat die Referenz des Submoduls supery
aufgerufen one.one
und geändert, um auf das Tag v1.1
von zu verweisen subby
.
Ich kann problemlos in jedem dieser Zweige arbeiten, aber wenn ich versuche, den one.one
Zweig mit Änderungen aus dem master
Zweig zu aktualisieren, erhalte ich einige Konflikte und weiß nicht, wie ich sie lösen kann.
Grundsätzlich sieht es nach einer git pull . master
Weile in der subby
Verzweigung so aus, als würden zusätzliche Submodule erstellt.
Vor dem Ziehen / Zusammenführen erhalte ich die gewünschte Antwort git submodule
von der one.one
Verzweigung:
$ git checkout master
$ git submodule
qw3rty...321e subby (v1.0)
$ git checkout one.one
$ git submodule
asdfgh...456d subby (v1.1)
Aber nach dem Ziehen werden zusätzliche Submodule hinzugefügt, wenn ich Folgendes ausführe git submodule
:
$ git pull . master
Auto-merged schema
CONFLICT (submodule): Merge conflict in subby - needs qu3rty...321e
Automatic merge failed; fix conflicts and then commit the results.
$ git submodule
qw3rty...321e subby (v1.0)
asdfgh...456d subby (v1.1)
zxcvbn...7890 subby (v1.1~1)
Wie lösche / ignoriere ich die unerwünschten Submodulreferenzen und begebe meine Konflikte und Änderungen? Oder gibt es einen Parameter, den ich mit meinem Original verwenden git pull
kann, der meine Submodule ignoriert?
quelle
added by us: ../Mono.Cecil
ingit status
abergit add
undgit rm
scheiterte mit,Mono.Cecil: needs merge, pathspec 'Mono.Cecil/' did not match any files
weil es nur ein leerer Ordner war und Git nur wirklich Dateien handhabt.git checkout
gab mirMono.Cecil: needs merge, error: you need to resolve your current index first
,git submodule update
gabSkipping unmerged submodule Mono.Cecil
undgit checkout master Mono.Cecil
reparierte es endlich. Grundproblem: Dergit status
Vorschlag ist falsch, wählen Sie also einen Zweig aus und nehmen Sie die Kopie des Ordners mitcheckout
!git checkout --ours SUBMOD
undgit add SUBMOD
und andere, aber schließlich Tungit checkout master SUBMOD
den Konflikt festgelegt. Dieser Kommentar sollte wahrscheinlich eine Antwort sein, kein Kommentar ... :)Nun, es ist nicht technisch, Konflikte mit Submodulen zu verwalten (dh: dies behalten, aber nicht das), aber ich habe einen Weg gefunden, weiter zu arbeiten ... und alles, was ich tun musste, war auf meine
git status
Ausgabe zu achten und die Submodule zurückzusetzen:Das würde das Submodul auf das Pre-Pull-Commit zurücksetzen. Was in diesem Fall genau das ist, was ich wollte. In anderen Fällen, in denen die Änderungen am Submodul vorgenommen werden müssen, werde ich diese mit den Standard-Submodul-Workflows (Checkout-Master, Herunterziehen des gewünschten Tags usw.) behandeln.
quelle
Ich hatte ein wenig Probleme mit den Antworten auf diese Frage und hatte auch nicht viel Glück mit den Antworten in einem ähnlichen SO-Beitrag . Das hat also für mich funktioniert - wenn man bedenkt, dass in meinem Fall das Submodul von einem anderen Team gewartet wurde, kam der Konflikt von verschiedenen Submodulversionen in Master und meinem lokalen Zweig des Projekts, an dem ich gearbeitet habe:
git status
- Notieren Sie sich den Submodulordner mit KonfliktenSetzen Sie das Submodul auf die Version zurück, die zuletzt im aktuellen Zweig festgeschrieben wurde:
git reset HEAD path/to/submodule
Zu diesem Zeitpunkt haben Sie eine konfliktfreie Version Ihres Submoduls, die Sie jetzt auf die neueste Version im Repository des Submoduls aktualisieren können:
Und jetzt können Sie
commit
das und wieder an die Arbeit gehen.quelle
Suchen Sie zunächst den Hash, auf den Ihr Submodul verweisen soll. dann renne
Das hat für mich funktioniert, um mein Submodul auf die richtige Hash-Referenz zu bringen und meine Arbeit fortzusetzen, ohne weitere Konflikte zu bekommen.
quelle
Ich hatte dieses Problem mit
git rebase -i origin/master
einer Filiale. Ich wollte die Master-Version des Submoduls ref nehmen, also tat ich einfach:git reset master path/to/submodule
und dann
git rebase --continue
Das hat das Problem für mich gelöst.
quelle
Ich habe Hilfe von dieser Diskussion bekommen. In meinem Fall die
hat für mich gearbeitet :)
quelle
Nun, in meinem Elternverzeichnis sehe ich:
Also habe ich das einfach gemacht
quelle