2009-05-07 15 views
26

Estoy usando tanto mercurial como git para diferentes proyectos y me gustan ambos. Lo que me resulta un poco molesto sobre mercurial es que "hg status" muestra rutas relativas a la raíz del repositorio, no al directorio actual (a diferencia de git). ¿Puede este comportamiento ser modificado de alguna manera?Mercurial "hg status" y paths relativos

+0

creo una opción en .hgrc se debe añadir, ver http://bz.selenic.com/show_bug.cgi?id=3835 para la solicitud de función. –

Respuesta

28

La solución habitual consiste en ejecutar:

hg status $(hg root) 

Para versiones anteriores de Mercurial, antes de la 1.7, se puede utilizar este truco, añadiendo al expediente de su repositorio ".hg/hgrc":

[alias] 
sst = status /path/to/root 

Necesita la extensión de alias habilitada, por lo que quizás tenga que agregar "alias =" a su archivo ~/.hgrc.

Comenzando con Mercurial 1.7, la extensión de alias descubrió el "!" escapar a utilizar los comandos de shell, por lo que ahora se puede tener un alias global que hace esto:

[alias] 
sst = !hg status $($HG root) $HG_ARGS 

No utilice st = !hg status $(hg root), ya que crea un bucle infinito, el estado de funcionamiento hg una y otra vez. Se parece a un error en la lectura de alias - si desea crear un alias hg status para mostrar el camino de la raíz, entonces el siguiente conjuro funciona en el global $ HOME/.hgrc:

[alias] 
__mystatus = status 
st = !hg __mystatus $($HG root) $HG_ARGS 
+1

Gracias! Es triste que alias ext. no permite comandos de shell en este momento, así que voy a hacer "hg status $ (hg root)" un alias de bash en su lugar. – pachanga

+0

Su último ejemplo de alias no pasará ninguna opción al estado (como --quiet). La última línea debería ser 'st =! Hg __mystatus $ (raíz $ HG) $ HG_ARGS' – krupan

+0

@krupan gracias! He actualizado la respuesta con ese consejo. Raramente uso los argumentos para el estado, así que no había llegado al problema. – richq

35

para ver el estado del espacio de trabajo relativa al directorio actual siempre puedes usar "." (Un solo punto) como argumento de "hg status", es decir:

% hg root     # root of the workspace 
/work/foo 

% pwd      # current directory is <root>/src 
/work/foo/src 

% hg status     # no argument, see all files 
M etc/foo.conf    # all files are shown with paths 
M src/foosetup.c   # relative to workspace root 
% 

La diferencia cuando se pide explícitamente el directorio de trabajo actual es que los caminos nombre de archivo relativo usar eso como su punto de partida:

% hg status .    # see only files under current path 
M foosetup.c 
% 
+0

Solución mucho mejor y más limpia que la "aceptada". – vadipp

+6

Desafortunadamente, no es exactamente lo mismo, más limitado, que la solución aceptada. Por lo tanto, no es universalmente mejor y más limpio. "estado hg". solo informa el estado del subárbol debajo., usando rutas relativas. "hg status $ (hg root)" informa el estado de todo el repositorio, utilizando rutas relativas a CWD. Debido a que es difícil mostrar esto en un comentario, estoy agregando una nueva respuesta con ejemplos. –

2

Hg está mejorando con el tiempo: Con hg 2.2.3, puedo definir st alias.

[alias] 
st = !hg status $($HG root) $HG_ARGS 

En consecuencia:

  • hg st le dará ruta relativa al directorio actual
  • hg status le dará ruta relativa al directorio raíz hg
2

Estoy añadiendo esta respuesta no porque es mejor que la respuesta aceptada, pero porque aclara la distinción entre "estado hg". y "hg status $ (hg root)". Lo cual puede haber confundido a algunos comentaristas, lo que puede llevar a olvidar verificar las cosas necesarias.

"hg status." solo informa el estado del subárbol debajo., usando rutas relativas.

"hg status $ (hg root)" informa el estado de todo el repositorio, utilizando las rutas relativas a CWD.

Ambos son útiles.

(En general, "ruta de estado de hg" muestra el estado del subárbol debajo de la ruta (todo el repositorio si path = $ (hg root) ", pero relativo a CWD.(Debo admitir que encuentro esto confuso, porque hay dos cosas sucediendo: subárbol para obtener el estado activado, y cwd para mostrar las rutas relativas a).)

Esto se muestra con el ejemplo de una sesión de shell incrustada a continuación.

$ bash [~/hack] 562 $> mcd hg-test 
./hg-test 
$ bash [~/hack/hg-test] 563 $> hg init . 
$ bash [~/hack/hg-test] 564 $> mkdir subdir 
$ bash [~/hack/hg-test] 565 $> touch foo 
$ bash [~/hack/hg-test] 566 $> touch subdir/bar 
$ bash [~/hack/hg-test] 567 $> hg status 
? foo 
? subdir/bar 
$ bash [~/hack/hg-test] 552 $> hg status $(hg root) 
? foo 
? subdir/bar 
$ bash [~/hack/hg-test] 552 $> cd subdir 
./subdir 
$ bash [~/hack/hg-test/subdir] 553 $> hg status 
? foo 
? subdir/bar 
$ bash [~/hack/hg-test/subdir] 553 $> hg status . 
? bar 
$ bash [~/hack/hg-test/subdir] 513 $> hg status $(hg root) 
? ../foo 
? bar 
$ bash [~/hack/hg-test/subdir] 523 $> hg status 
? foo 
? subdir/bar 

Por lo tanto, si quieres hacer algo como hacer una copia de seguridad de los archivos en el subárbol locales, sin registro, y luego volver (a menudo necesito hacer esto cuando se utiliza "bloqueo hg", porque estoy utilizando archivos FrameMaker que no pueden diferenciarse o se fusione dentro de Hg (o casi nada)):

$ bash [~/hack/hg-test/subdir] 523 $> mkdir bak; hg status -n . | xargs cp --target-directory bak 
$ bash [~/hack/hg-test/subdir] 524 $> ls bak 
bar 

Pero si desea realizar una copia de seguridad de todos los archivos en el árbol que se informó por el estado

$ bash [~/hack/hg-test/subdir] 528 $> mkdir bak-root; hg status -n $(hg root) | xargs cp --target-directory bak-root 
cp: will not overwrite just-created `bak-root/bar' with `bar' 
$ bash [~/hack/hg-test/subdir] 529 $> ls bak-root 
bar foo 

por el wa y, la advertencia muestra los problemas de nombres de archivos colisionantes. Usualmente uso una pequeña herramienta. Tengo que agregar un sufijo .bak, o xargs. Pero este ejemplo es suficiente.

por cierto^2 que suelo hacer este tipo de cosas con "hg status -nm", pero el ejemplo anterior es suficiente.

2

La forma estándar que funciona desde versiones antiguas de mercurio (> = 1.1 de 2008) es:

hg status re: 

que produce:

M ../contrib/buildrpm 
M ../hg 
M httprepo.py 

Desde mercurial 1.3 (2009) se puede definir un alias si quieres:

[alias] 
sst = status re: 

Este comportamiento fue finalmente documentado en 3.4 (2015):

$ hg help status --verbose 
[...] 
- show changes in the working directory relative to the current directory 
    (see 'hg help patterns' for more information): 

    hg status re: 

Desde mercurial 4.2 (mayo de 2017) se puede decir el comando de estado para imprimir siempre las rutas relativas poniendo esto en su hgrc:

[commands] 
status.relative = True 

Prueba directamente en la línea de comandos (hg> = 4.2):

$ hg --config commands.status.relative=True status 
M ../contrib/buildrpm 
M ../hg 
M httprepo.py 

Por último, mercurial 4.3 introdujo ui.tweakdefaults que, entre otras cosas, cambia algunos valores por defecto a otras más modernas:

[ui] 
# hg status prints relative paths 
# hg diff produces patches in git format 
tweakdefaults = True 

Si usted está en un mercurial moderna (> = 4.3), esta es la recomendada oficialmente camino.

Cuestiones relacionadas