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
Respuesta
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
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
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
@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
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
%
Solución mucho mejor y más limpia que la "aceptada". – vadipp
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. –
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 actualhg status
le dará ruta relativa al directorio raíz hg
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.
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.
- 1. Usando hg revertir en Mercurial
- 2. Mercurial HG colisión caso plegado?
- 3. Mercurial hg serve multiple repositories
- 4. Mercurial deshacer tres hg push
- 5. Mercurial predeterminado de combinación hg
- 6. Mercurial: enumere archivos "hg diff"
- 7. Mercurial: aplicar "hg pull -u" antes de "hg commit"
- 8. Impedir que "hg status" muestre todo en directorios no rastreados
- 9. bitbucket, "hg push" y "hg update"
- 10. Mercurial (HG) parámetros de extracción: nombre de usuario y contraseña
- 11. Mercurial hg Subrepository issue - "abort: revisión desconocida"
- 12. Importar historial de TFS en Mercurial (hg)
- 13. Cómo revertir un mercurial hg pull?
- 14. Mercurial/hg - abortar: fusiones no confirmadas pendientes
- 15. Mercurial (hg) comprometer solo ciertos archivos
- 16. Uso del paquete mercurial hg y la exportación de hg frente a la fusión?
- 17. msys git y long paths
- 18. ¿cuál es la diferencia entre hg tag y hg bookmark?
- 19. ramificación Mercurial y marcadores
- 20. Mercurial y fusionar herramientas?
- 21. ¿Cómo obtener mercurial para notar archivos agregados en subdirectorios? (hg st, hg add)
- 22. hg: ¿Cómo cambio el idioma de mi instalación de Mercurial (hg)? (MacOS)
- 23. Mercurial: ¿Cómo hacer que HG LOG muestre un padre trivial?
- 24. Git como cliente mercurial? ¿Por qué no git-hg?
- 25. ¿Cómo eliminar una rama en bitbucket con mercurial hg?
- 26. Hosting Mercurial HG a través del servidor VisualSVN
- 27. Habilitar la finalización de la pestaña bash para Mercurial (hg)
- 28. ¿Cómo ver los comandos de Mercurial emitidos por Tortoise HG?
- 29. Obtener mercurial "hg commit" para trabajar con Notepad ++
- 30. Cómo usar mercurial (Hg) dentro de una aplicación Python?
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. –