2008-09-29 8 views
37

Normalmente utilizo Tortoise SVN, pero he estado investigando a Mercurial ya que es un sistema de control de revisión distribuido.¿Puedo comprometer solo partes de mi código usando SVN o Mercurial?

Lo que estoy buscando, en ambos sistemas, es una herramienta que me permite elegir solo partes de un archivo y confirmarlas. Si quiero hacer esto ahora, tengo que copiar a una versión temporal del archivo y mantener solo los cambios que deseo confirmar en la versión actual, y luego copiar la versión temporal a la versión actual nuevamente después de confirmar. Es una molestia y el programa debería poder hacer esto por mí.

Oí que Git admite esto, por favor, avíseme si esto es correcto.

+1

Debe ser bastante fácil desarrollar una herramienta para SVN. Me pregunto por qué nadie hizo esto todavía. –

+0

@PavelRadzivilovsky parches de bienvenida. Quiero decir que puedes escribir un parche y enviarlo a la lista de correo dev @. – bahrep

+0

Ahora existe una utilidad de confirmación "interactiva" incorporada para este propósito exacto que sale de la caja con Mercurial. Ver mi respuesta a continuación. – Oly

Respuesta

38

Mercurial puede hacer esto con la extensión record.

Te solicitará cada archivo y cada trozo de diferencia. Por ejemplo:

% hg record 
diff --git a/prelim.tex b/prelim.tex 
2 hunks, 4 lines changed 
examine changes to 'prelim.tex'? [Ynsfdaq?] 
@@ -12,7 +12,7 @@ 
\setmonofont[Scale=0.88]{Consolas} 
% missing from xunicode.sty 
\DeclareUTFcomposite[\UTFencname]{x00ED}{\'}{\i} 
-\else 
+\else foo 
\usepackage[pdftex]{graphicx} 
\fi 

record this change to 'prelim.tex'? [Ynsfdaq?] 
@@ -1281,3 +1281,5 @@ 
%% Local variables: 
%% mode: latex 
%% End: 
+ 
+foo 
\ No newline at end of file 
record this change to 'prelim.tex'? [Ynsfdaq?] n 
Waiting for Emacs... 

Después de la confirmación, el diff restante se quedará atrás:

% hg di 
diff --git a/prelim.tex b/prelim.tex 
--- a/prelim.tex 
+++ b/prelim.tex 
@@ -1281,3 +1281,5 @@ 
%% Local variables: 
%% mode: latex 
%% End: 
+ 
+foo 
\ No newline at end of file 

Alternativamente, puede que le resulte más fácil de usar MQ (Colas de Mercurial) para separar los cambios individuales en su repositorio en parches. También hay una variante MQ de registro (qrecord).

Actualización: También pruebe la extensión crecord, que proporciona una interfaz de maldiciones para la selección de hunk/line.

crecord screenshot

+1

Es una pena que no haya una herramienta de GUI para esto. Es maravilloso hacer esto con GitX. – mxcl

+0

Amen. GitX es * la * razón por la que uso Git; desearía que Murky fuera tan capaz. (Desafortunadamente estoy demasiado sobrecargado con proyectos de código abierto para solucionarlo, aunque he contribuido tanto a GitX como a Murky :-) –

+2

Hay una herramienta de GUI para esto: Tortoisehg admite la selección de trozos. – Hauge

0

Yo recomendaría que no trabaja así.

Si tiene que realizar un conjunto de cambios, configure A que esté listo para registrar y configure B que aún no está listo, ¿cómo puede estar seguro de que solo revisar el conjunto A no romperá su compilación/pruebas? Puede omitir algunas líneas, olvidarse de las líneas en un archivo diferente o no darse cuenta de una dependencia que A tiene en B rompiendo la construcción para otros.

Sus compromisos deben ser cambios atómicos discretos que no rompan la construcción para usted u otros en su equipo. Si está cometiendo parcialmente un archivo, está aumentando las posibilidades de que rompa la construcción para otros sin saberlo hasta que un colega infeliz llame a su puerta.

La gran pregunta es, ¿por qué sientes la necesidad de trabajar de esta manera?

+0

Git lo permite agrupando líneas adyacentes. Puede ser REALMENTE útil si necesita registrar algo simple y no desea hacer una sucursal. – davetron5000

+6

Normalmente, es porque escribo demasiado código antes de comprometerme. Podría cambiar dos cosas diferentes en un archivo y quiero confirmarlas con diferentes comentarios. – RobbieGee

+3

Git admite (con git stash --keep-index) aislando solo los cambios que está a punto de comprometer, lo que le permite ejecutar pruebas unitarias o cualquier otra cosa fácilmente. –

5

Hace un momento pedí un similar question, y la respuesta resultante de usar el hgshelve extension era exactamente lo que estaba buscando.

Antes de realizar una confirmación, puede poner cambios de diferentes archivos (o trozos de cambios dentro de un archivo) en el "estante" y luego confirmar las cosas que desea. Luego puede desmantelar los cambios que no cometió y continuar trabajando.

Lo he estado utilizando en los últimos días y me gusta mucho. Muy fácil de visualizar y usar

12

Sí, git le permite hacer esto. El comando git add tiene una opción -p (o --patch) que le permite revisar sus cambios hunk-by-hunk, seleccionar qué escenario (también puede refinar los trozos o editar los parches en su lugar).También puede usar el modo interactivo para agregar git (git add -i) y usar la opción "p".

Aquí hay un screencast on interactive adding que también muestra la característica de parche de git add.

+1

También tenga en cuenta que 'git gui' ofrece una forma gráfica de hacerlo. –

7

Echa un vistazo a TortoiseHG, que hará la selección de trozos y te permitirá confirmar diferentes cambios en un archivo en cuanto a las diferentes confirmaciones.

Incluso le permitirá confirmar todos los cambios en algunos archivos junto con cambios parciales a otros archivos en una confirmación.

http://tortoisehg.bitbucket.io/

+0

la GUI es solo Windows – user7610

+1

@ user7610 no, admite Linux también –

+0

la extensión Nautilus y la CLI sí, pero algunas herramientas GUI en TortoiseHg son para Windows – user7610

1

Mercurial ofrece ahora una opción --interactive (o -i) al comando commit, que permite esta funcionalidad sacarlo de la caja.

Esto funciona directamente desde la línea de comandos, por lo que es perfecto si eres un entusiasta de la línea de comandos.

Correr

> hg commit -i 

comienza una sesión interactiva que permite a examen, edición y grabación de los cambios individuales para crear un commit.

Esto se comporta de manera muy similar a las opciones --patch y --interactive para los comandos git add y git commit.

+0

Esto es la mejor respuesta Sin necesidad de extensión, etc. Gracias por la respuesta. –

Cuestiones relacionadas