Ich war mit dem gleichen Problem konfrontiert und konnte keinen Weg finden, die StashApplyCommand
mir sagen, welche Dateien einen Konflikt verursachen.
Die Problemumgehung, die ich derzeit verwende, ist die Verwendung eines ResolveMerger
, um zu sehen, ob der Stash angewendet werden kann. Wenn es widersprüchliche Dateien gibt, kann der Zusammenschluss sie auflisten.
Zum Beispiel:
ObjectId headCommitId = // id of head commit
RevCommit stashCommit = // parsed stash (commit) to be applied
ObjectId stashHeadCommit = stashCommit.getParent(0);
ResolveMerger merger = (ResolveMerger)MergeStrategy.RESOLVE.newMerger(repository, true);
merger.setWorkingTreeIterator(new FileTreeIterator(repository));
merger.setBase(stashHeadCommit);
if(!merger.merge(headCommitId, stashCommit)) {
// look into merger.getFailingPaths() and merger.getUnmergedPaths()
}
Beachten Sie, dass der obige Code-Schnipsel nicht Index Konflikte wie in meiner Umgebung erkennen würde, kann der Index nie zu Konflikten führt. Obwohl es möglich sein sollte, diesen Ansatz zu erweitern, um den Index für Konflikte zu untersuchen. IIRC stashCommit.getParent(1)
verweist auf den gespeicherten Index.
In der Hoffnung, dass die Abhilfe veraltet 1 Tag wird, habe ich einen Verbesserungsvorschlag eingereicht: https://bugs.eclipse.org/bugs/show_bug.cgi?id=501475
Vielen Dank für die Anregung und für die Verbesserung Anfrage einzureichen. Ihr Ansatz sieht so aus, als sollte er funktionieren, aber aus irgendeinem Grund entdeckt er keine Konflikte. Die verdeckten Änderungen, die ich anwenden möchte, sind nicht inszeniert, daher sollte dies in meinem Fall nicht den Index beinhalten. Es gibt jedoch einen Aspekt Ihrer Antwort, den ich nicht verstehe. Warum muss stashCommit.getParent (0) aufgerufen werden? Wird dieser Aufruf nicht denselben Commit zurückgeben, den stashCommit identifiziert? – Epicurus
Ich nahm den 'getParent (0)' 'Umweg' von 'StashApplyCommand', in der Annahme, dass es auf das Commit der gespeicherten Dateien verweist. Aber wenn ich wieder lese, könnte ich mich hier irren (obwohl ich mich wundere, warum meine Tests bestanden werden ...). Wenn Sie jedoch den JGit-Code erneut lesen und [this post] (http://stackoverflow.com/questions/27012878/why-is-a-stash-represented-as-2- commits) können Sie erfolgreich sein, wenn Sie 'stashCommit verwenden 'anstelle von' stashCommit.getParent (0) '. Parent 1 scheint auf den HEAD zu verweisen, aus dem der Stash erstellt wurde. Und HEAD kann immer mit sich selbst verschmolzen werden. –
Wenn Sie einen eigenständigen Testfall mit Ihrer nicht funktionierenden Konflikterkennung teilen könnten, würde das helfen, herauszufinden, was falsch läuft. –