2008-10-10 3 views
20

CVS und Subversion verfügen beide über eine praktische Funktion zum Zusammenführen, so dass beim Aktualisieren einer von Ihnen geänderten Quelldatei Änderungen, die andere an der gleichen Datei vorgenommen haben, zusammengeführt werden.Können CVS und Subversion so eingestellt werden, dass Leerzeichen beim Zusammenführen ignoriert werden?

Wenn jedoch Ihre Änderungen und die anderen nicht kompatibel sind - in der Regel, wenn Sie beide die gleichen Teile des Codes geändert haben - wird es einen Konflikt erstellen. Beide Abschnitte des Quellcodes werden in die zusammengeführte Datei eingefügt, und Sie müssen manuell sortieren, welche Änderungen beibehalten werden sollen. Alles soweit in Ordnung.

Mein Problem ist, dass einige von uns verschiedene Entwicklungsumgebungen verwenden (Netbeans versus vi, wenn Sie wissen müssen) und Netbeans hat eine automatische Einzugfunktion, die den Code erneut einprägt. Wenn wir also Änderungen zusammenführen, erhalten wir manchmal große Konflikte, die meist durch einfache Änderungen im Einzug verursacht werden und keine echten Änderungen am Code darstellen. Oft erzeugen diese Hunderte von Zeilen scheinbarer Konflikte, die manuell gelöst werden müssen, aber in der Regel sind es nur ein paar Zeilen echter Änderungen. Eine ähnliche Situation tritt auf, wenn der Editor eines Benutzers Unix in Windows-Zeilenvorschübe ändert oder umgekehrt.

Also - kann ich Merge setzen, um diese "Konflikte" beim Vergleich der beiden Versionen zu ignorieren? Diff hat die Option --ignore-space-change oder -b und ich möchte im Wesentlichen die gleiche Funktion in cvs oder svn haben. Wir verwenden jedes Tool für verschiedene Projekte, daher würde ich mich freuen, wenn ich eine oder beide Antworten hätte.

Zwei abschließende Bemerkungen:

  • eindeutig der Mergeprozesses müßten eine willkürliche Wahl treffen, welche Version des Leerzeichen in der fusionierten Datei zu verwenden. Mir geht es gut - wir können es später immer wieder neu formatieren.
  • Ich könnte etwas davon vermeiden, indem ich disziplinierter und häufiger eingecheckt - anerkannt und verstanden. Aber ich bin nicht perfekt.

Antwort

11

Für SVN: In Kommandozeilen-Tool, gibt es die Option -x, die Sie "b" oder "w" Raum bzw. Änderungen ignorieren festlegen können. alle Räume.
Sie können auch ein Drittanbieter-Tool für die Zusammenführung bereitstellen. Wenn Sie also einen Merger haben, der Whitespaces ignoriert, können Sie diesen verwenden. TortoiseSVN ist wie immer ein Frontend für alle Parameter, so dass auch Whitespaces ignoriert werden können.

Der Befehl svn merge wird beschrieben here. Die Option, die Sie brauchen, ist --diff3-cmd

+0

Klingt gut, danke. Dann ist die nächste Frage: Kennt jemand eine Fusion, die Whitespaces ignorieren kann? Bei einer anderen Frage habe ich ein paar visuelle Merge-Tools gefunden, die gut aussehen (meld, tortoisesvn), aber kennt jemand eine Befehlszeile? –

+0

Sie können in Winmerge schauen (http://www.winmerge.org/) Es ist opensource und Sie können es einfach in TortoiseSVN als diff/merge Viewer verwenden –

+0

Ich habe dies auf Linux untersucht, und es scheint, dass es gibt keine einfache Möglichkeit, dies zu tun. Z. B. können Sie ihm sagen, dass er "diff3" verwenden soll, aber er hat keinen Parameter, um Whitespace zu ignorieren. Aber Sie können diesen Parameter übergeben, um ein anderes "diff" -Programm zu verwenden. Also, Sie haben es "diff-b" nennen. Aber dann können Sie das nicht (scheinbar) rekursiv aus dem SVN-Befehl tun (d. H. Svn (unter Verwendung von diff3 (unter Verwendung von (diff -b)))). Die Lösung, die ich als nächstes untersuchen werde, ist das Erstellen eines Shell-Skripts, das "diff3" aufruft, wobei "diff" verwendet wird, um Leerzeichen zu ignorieren. Dann werde ich SVN das Shell-Skript verwenden. – UncaAlby

5

Für Windows-Benutzer können Sie TortoiseSVN (Windows Explorer-Shell-Erweiterung für Subversion) benutzen, die mit merge features kommt, dass die Unterstützung, was Sie beschreiben:

Das Ignorieren von Zeilenenden schließt Änderungen aus, die ausschließlich auf den Unterschied in Zeilenende-Stil zurückzuführen sind.

Vergleichen Sie whitespaces enthält alle Änderungen in Einrückung und Inline Leerzeichen als hinzugefügt/entfernt Zeilen.

Ignorieren Leerzeichen Änderungen ausschließen Änderungen, die in der Menge oder die Art der Leerzeichen, zum Beispiel ausschließlich auf eine Änderung fällig sind.Ändern der Einrückung oder Ändern der Registerkarten in Leerzeichen. Whitespace hinzufügen, wo zuvor keine war, oder Whitespace vollständig entfernen, wird immer noch als eine Änderung angezeigt.

Alle Leerräume ignorieren Alle Leerraum-Nur-Änderungen ausschließen.

0

TortoiseMerge hat keine CLA (Befehlszeilenargumente), um den Leerraum zu ignorieren und den Fall zu ignorieren. Nach vielem Suchen scheint es, dass es noch erreicht werden kann, indem man die Registrierungswerte optimiert.

/* DisableWhitespaceDifferences and DisableCaseDifferences. 
* The settings for TortoiseMerge is stored in Registry in CurrentUser\Software\TortoiseMerge\ 
* DWORDS stored the property values. 
* 
* IgnoreWS   : Set to 1 to ignore the whitespace differences. 
*      Set to 0 to allow the whitespace differences.    
* IgnoreEOL  : Set to 1 to ignore the End of Line differences. 
*      Set to 0 to allow the End of Line differences.    
* CaseInsensitive : Set to 1 to ignore the Case differences. 
*      Set to 0 to allow the Case differences.    
*/ 

// Get the key from the registry 
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\TortoiseMerge", true)) 
{ 
    if (key != null) 
    { 
     // Set the IgnoreWS and IgnoreEOL DWORDs based on DisableWhitespaceDifferences is set or not 
     key.SetValue("IgnoreWS", DisableWhitespaceDifferences ? 1 : 0, RegistryValueKind.DWord); 
     key.SetValue("IgnoreEOL", DisableWhitespaceDifferences ? 1 : 0, RegistryValueKind.DWord); 

     // Set the CaseInsensitive DWORD based on DisableCaseDifferences is set or not 
     key.SetValue("CaseInsensitive", DisableCaseDifferences ? 1 : 0, RegistryValueKind.DWord); 

     // close key 
     key.Close(); 
    } 
}