git: hash autocomplete

¿Hay alguna posibilidad de configurar git para autocomplete los hash al presionar TAB ?

Editar:

Tenga en count que esta pregunta no se trata de autocomplete , sino de autocomplete hash . Ver mi comentario a la respuesta de VonC

Si tiene que considerar todos los hash de su repository, esto no es probable porque no se escalaría bien (si tiene varios cientos de commits, tags, … cada uno con sus propios hashes, esto tomaría rápidamente un largo time para enumere todos a less que tenga algún sistema de almacenamiento en caching para esta list hash)

Si limita los valores hash a una list bastante reciente (en la twig actual, por ejemplo), puede ser, pero eso no cubrirá todos los casos de uso.

Aquí tiene un ejemplo de git shell con types diferentes de expansión de tabs (en PowerShell), mejorado aún más aquí .
Incluso si su entorno no tiene ningún uso para PowerShell, eso le da una idea de la implementación de la "expansión de tabs".

Puede referirse a una confirmación solo por sus primeros caracteres: git se autocompleteá internamente:

 git checkout 9771 

Por lo tanto, ¡en realidad no tiene que ingresar el hash completo!

Lo siento, no soy un experto en bash. Pero intenté comstackr algo así para la familia csh y esto debería ser fácil de transformar en un script de finalización de bash para aquellos que conocen bash.

La línea de command que estoy usando para get hash de confirmación recientes útiles es similar a:

 (git branch | cut -c3-) ; (git branch | cut -c3- | xargs -ibranch git log -n 100 --pretty=format:%+H branch | sort -u) 

Esta línea funciona para ambos: bash y csh.

Básicamente es la concatenación de los nombres de las twigs:

 git branch | cut -c3- 

y el último (con n es 100) nombres de confirmación (= numbers completos de hash)

 git branch | cut -c3- | xargs -ibranch git log -n 100 --pretty=format:%+H branch | sort -u 

La statement completa de autocompletado para csh es así

 # # tcsh completion for Git # # Taken from: https://gist.github.com/1663989 # and from: https://gtirtha.wordpress.com/2010/05/14/git-autocomplete/ # extended and merged them into what I (Ingo Schmiegel) like set _git_commands = (add am cherry-pick commit branch format-patch ls-files help remote merge pull push amend grep rebase reset revert bisect diff difftool blame log checkout fetch stash status wdiff config) set _git_aliase = `git config --get-regexp 'alias.*' | sed -e 's,alias.,,' | cut -d' ' -f1` complete git "p/1/($_git_commands $_git_aliase)/" \ "n/help/($_git_commands $_git_aliase)/" \ 'n/add/`git status --porcelain|cut -c4-|xargs echo`/' \ 'n/br/`git branch|cut -c 3-`/' 'N/br/`git branch|cut -c 3-`/' \ 'n/branch/`git branch|cut -c 3-`/' 'N/branch/`git branch|cut -c 3-`/' \ 'n/cb/`git branch|cut -c 3-`/' \ 'n/cherry-pick/`(git branch|cut -c3-);(git branch|cut -c3-|xargs -ibranch git log -n 100 --pretty=format:%+h branch|sort -u)`/' \ 'n/co$/`git branch|cut -c 3-`/' \ 'n/config/(--global --get-regexp --list)/' \ 'n/diff/(--color-words --name-only)/' \ 'n/difftool/(--no-prompt --prompt --tool)/' \ 'n/fetch/`git remote`/' \ 'n/format-patch/`(echo --output-directory --stdout --signoff);(git branch|cut -c3-);(git branch|cut -c3-|xargs -ibranch git log -n 100 --pretty=format:%+h branch|sort -u)`/' \ 'n/log/`git branch|cut -c 3-|xargs echo -- --name-only --name-status --reverse --committer= --no-color --relative --ignore-space-change --ignore-space-at-eol --format=medium --format=full --format=fuller --color --decorate --oneline --summary`/' \ 'n/lg/`git branch|cut -c 3-|xargs echo -- --name-only --name-status --reverse --committer= --no-color --relative --ignore-space-change --ignore-space-at-eol --format=medium --format=full --format=fuller --color --decorate --oneline --summary`/' \ 'n/ls-files/(--cached --deleted --others --ignonetworking --stage --unmerged --killed --modified --error-unmatch --exclude= --exclude-from= --exclude-standard --exclude-per-directory= --full-name --abbrev)/' \ 'n/merge/`git branch|cut -c 3-|xargs echo --no-commit --no-ff --ff-only --squash`/' \ 'N/merge/`git branch|cut -c 3-`/' \ 'n/pull/(--rebase --no-ff --squash)/' \ 'n/push/`git remote`/' 'N/push/`git branch|cut -c 3-`/' \ 'n/rebase/`git branch|cut -c 3-| xargs echo --continue --abort --onto --skip --interactive`/' \ 'N/rebase/`git branch|cut -c 3-`/' \ 'n/remote/(show add rm prune update)/' 'N/remote/`git remote`/' \ 'n/reset/(HEAD^)/' \ 'N/reset/(HEAD^)/' \ 'n/revert/`(echo --edit --no-edit --no-commit --mainline);(git branch|cut -c3-);(git branch|cut -c3-|xargs -ibranch git log -n 100 --pretty=format:%+h branch|sort -u)`/' \ 'n/stash/(apply list save pop clear show drop create branch)/' \ 

Tenga en count que esto no detecta automáticamente el inicio de un hash y luego puede autocompletelo. La autocompletación de csh se basa en el context de la (s) palabra (s) anterior (es). En este ejemplo, estoy usando la finalización de hash solo para los commands de git, cherry-pick , format-patch y revert commands.

En Linux tienes git shell: dev-vcs / git-sh, dev-util / easygit. Además, si habilitas la finalización de bash para git obtendrás autocomplete.