2016-09-14 2 views
2

Ich verwende die StashApplyCommand Klasse, um verdeckte Commits auf den Arbeitsbaum anzuwenden. Falls Konflikte auftreten, löst die call()-Methode dieser Klasse eine StashApplyFailureException aus.List Stash anwenden Konflikte in JGit

Ich kann jedoch keine Möglichkeit finden, die Liste der Konflikte abzurufen. Im Gegensatz zur MergeCommand gibt die StashApplyCommand diese Liste nicht als Teil des Rückgabewerts der call()-Methode zurück.

Ist es überhaupt möglich, die Konflikte, die durch einen Stash verursacht werden, in JGit anzuwenden?

Antwort

2

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

+0

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

+0

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. –

+0

Wenn Sie einen eigenständigen Testfall mit Ihrer nicht funktionierenden Konflikterkennung teilen könnten, würde das helfen, herauszufinden, was falsch läuft. –