¿Puedo incrustar el siguiente código de shell bash:
for name in $(git diff --name-only $1); do git difftool $1 $name & done
directamente en la creación de un alias de git:
git config --global alias.diffall ***my-bash-code-here***
Esto conduce a mi pregunta / respuesta anterior sobre SO, donde puse el código en un archivo .sh y luego le asigné un alias al archivo:
git config --global alias.diffall '!sh diffall.sh'
Pero en la búsqueda interminable de simplicidad, ¿debe haber una forma de omitir el archivo e insertar código directamente en el alias? No puedo entender el formato ...
! binary
!sh git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')
da como resultado/usr/lib/git-core/git: /usr/lib/git-core/git: cannot execute binary file
. Lo probé con y sinsh
al principio.Para ejecutar comandos dentro de un alias de git, y en particular para pasar argumentos a esos comandos, probablemente tendrá que crear una función temporal que luego invocará inmediatamente:
$ vim ~/.gitconfig ... [alias] # compare: foo = "! echo begin arg=$1/$2/end" foo2 = "!f() { echo "begin arg=$1/$2/end"; }; f"
En este ejemplo, la función es probablemente lo que necesita (y también es más flexible en cuanto a lo que puede hacer en una sola "declaración"); y probablemente pueda decir que para ambas opciones, los argumentos restantes del comando git simplemente se pasan como argumentos al alias, independientemente de si es "echo" o "f"; invocar la función simplemente consume los argumentos, ignorando lo que no se usa explícitamente:
Otro ejemplo (enumera todos los alias, según el patrón coincidente) (nota: puede seguir reutilizando el mismo nombre de función "f ()" en todo el .gitconfig):
[alias] alias = "!f() { git config --get-regexp "^alias.${1}$" ; }; f"
El primero devuelve el alias solo para "foo $", el segundo para "foo. *":
$ git alias foo alias.foo ! echo begin arg=$1/$2/end $ git alias 'foo.*' alias.foo ! echo begin arg=$1/$2/end alias.foo2 !f() { echo begin arg=$1/$2/end; }; f
(nb: los resultados reales pueden variar según el shell; estoy usando esto con bash en Linux, Unix y Cygwin (Windows)).
fuente
sh -c
, de esa manera no tiene que preocuparse por cuál es el shell de inicio de sesión del usuario.git status
, con alias personalizados"No pude encontrarlo en la documentación, pero si crea un script "git- <name>" en la ruta, puede llamarlo con "git name" en su repositorio.
Ver:
$ cd ~/bin $ echo "echo I love this log: >pwd >git log --graph --summary --decorate --all" > git-logg $ chmod +x git-logg $ cd /path/to/your/repo $ git logg I love this log: /path/to/your/repo * commit 3c94be44e4119228cc681fc7e11e553c4e77ad04 (whatever-branch) | Author: myself <my@Laptop.(none)> | Date: Fri Apr 1 16:47:20 2011 +0200 | | would have been better not to do it at all | ... $
Por lo tanto, también puede escribir cualquier alias que desee con esta forma (bastante oscura).
Aún más, puede agregar autocompletar a ese nuevo comando que define una función. Información aquí
$ _git_logg () { # you can return anything here for the autocompletion for example all the branches __gitcomp_nl "$(__git_refs)" }
fuente
Agregar estas 2 líneas a su archivo .git / config debería ser suficiente.
[alias] diffall = '!for name in $(git diff --name-only $1); do git difftool $1 $name & done'
Editar: presumiblemente, la versión de git-config también funciona, pero me gusta mantener mis alias en el archivo de configuración para facilitar la administración.
Hay una bonita página en la wiki de git que explica los alias muy claramente: http://git.or.cz/gitwiki/Aliases En particular, lea 'alias avanzados con argumentos'
fuente
(De la documentación de ProGit: http://progit.org/book/ch7-3.html )
¿Ha intentado agregar un script en .git / hooks?
Por ejemplo, si crea un script .git / hooks / post-checkout:
#!/bin/bash echo "This is run after a 'git checkout'"
y luego ejecute el comando:
$ git checkout master Switched to branch 'master' This is run after a 'git checkout'
fuente