2008-10-10 20 views
20

Tanto CVS como Subversion tienen una práctica función de combinación para que cuando actualice un archivo fuente que haya modificado, se una a los cambios que otros hayan realizado en el mismo archivo.¿Se pueden configurar CVS y Subversion para que ignoren los espacios en blanco en la fusión?

Sin embargo, si sus cambios y los demás son incompatibles, generalmente si ambos han cambiado las mismas partes del código, creará un conflicto. Ambos tramos de código fuente se incluirán en el archivo fusionado y deberá determinar manualmente qué cambios conservar. Todo bien hasta ahora.

Mi problema es que algunos de nosotros utilizamos entornos de desarrollo diferentes (Netbeans versus vi si debe saber) y Netbeans tiene una función de sangría automática que vuelve a introducir el código. Por lo tanto, cuando fusionamos los cambios, a veces obtenemos grandes conflictos que son causados ​​principalmente por cambios simples en la sangría y no son cambios genuinos en el código. A menudo, estos crean cientos de líneas de conflictos aparentes que deben resolverse manualmente, pero generalmente se reducen a unas pocas líneas de cambios reales. Una situación similar ocurre cuando el editor de alguien cambia Unix a Windows newlines o viceversa.

Entonces, ¿puedo establecer la combinación para ignorar estos "conflictos" al comparar las dos versiones? Diff tiene la opción --ignore-space-change o -b y me gustaría tener esencialmente la misma característica disponible en cvs o svn. Usamos cada herramienta en diferentes proyectos, por lo que me gustaría obtener la respuesta para cualquiera de ellos o para ambos.

Dos notas finales:

  • claramente el proceso de fusión tendrían que hacer una elección arbitraria en cuanto a qué versión del espacio en blanco para usar en el archivo fusionado. Estoy de acuerdo con eso, siempre podemos volver a formatearlo más tarde.
  • Pude evitar algo de esto siendo más disciplinado y registrándome más seguido, reconocido y entendido. Pero no soy perfecto.

Respuesta

11

Para SVN: En la herramienta de línea de comandos, existe la opción -x que se pueden establecer a "b" o "w " ignorar el espacio cambia resp. todos los espacios.
También puede suministrar una herramienta de terceros para realizar las fusiones. Entonces, si tiene una fusión que ignora los espacios en blanco, puede usar esta. TortoiseSVN, como siempre, es una interfaz para todos los parámetros, por lo que también admitirá ignorar espacios en blanco.

El comando svn merge se describe here. La opción que necesita es --diff3-cmd

+0

Suena bien, gracias. Entonces, la siguiente pregunta es: ¿alguien sabe una fusión que puede ignorar espacios en blanco? En otra pregunta encontré algunas herramientas de fusión visual que se ven bien (meld, tortoisesvn) pero ¿alguien sabe de una línea de comandos? –

+0

puede ver en winmerge (http://www.winmerge.org/) Es de código abierto y puede usarlo fácilmente en tortugaSVN como diff/merge viewer –

+0

He estado investigando esto en Linux, y parece que hay no es una manera fácil de hacer esto. Por ejemplo, puedes decirle que use "diff3" pero no tiene ningún parámetro para ignorar el espacio en blanco. Pero puede pasarle un parámetro para usar un programa diferente "diff". Entonces, lo tienes llamar "diff -b". Pero luego no puedes hacer eso recursivamente (aparentemente) desde el comando SVN (es decir, svn (usando diff3 (usando (diff -b)))). La solución que voy a investigar a continuación es crear un script de shell que llame a "diff3" usando "diff" para ignorar el espacio en blanco. Entonces haré que SVN use el script de shell. – UncaAlby

5

Para los usuarios de Windows, puede utilizar TortoiseSVN (una extensión de shell de Windows Explorer para Subversion) que viene con merge features que apoyar lo que usted está describiendo:

Ignorar terminaciones de línea excluye los cambios que se deben únicamente a la diferencia en el estilo de extremo de línea .

Comparar espacios en blanco incluye todos los cambios en sangría y espacios en blanco como líneas añadidas/eliminadas.

ignorar los cambios espacios en blanco excluye cambios que se deben únicamente a un cambio en la cantidad o tipo de espacios en blanco, por ejemplo.cambiando la sangría o cambiando pestañas a espacios . Agregar espacios en blanco donde no había ninguno antes, o eliminar un espacio en blanco completamente todavía se muestra como un cambio.

Ignorar todos los espacios en blanco excluye todos los cambios de solo espacio en blanco .

0

TortoiseMerge no tiene ningún CLA (Argumentos de línea de comando) para ignorar los espacios en blanco e ignorar el caso. Después de buscar mucho, parece que todavía se puede lograr ajustando los valores del registro.

/* 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(); 
    } 
} 
Cuestiones relacionadas