tipos tag remove practices etiquetas crear best git bash bash-completion

remove - git tags best practices



Finalización de Bash: Honre el alias de Git específico del repositorio al completar alias (1)

No deberías usar alias en casos tan complicados, usa las funciones de bash . Los alias son más como un preprocesador en C (en el sentido de usar), cuando las funciones son más como ... funciones de código. Y he descubierto que también son más "auto-completas".

También puede observar cómo se resuelve este problema en otras conchas, como el fish .

Digamos que bash está configurado con el siguiente alias:

alias up="git --git-dir /path/to/backup/.git"

Y ese repositorio en particular, y solo ese repositorio, tiene el siguiente alias de git:

[alias] backup = commit --allow-empty-message

¿Cómo puede up backup automática completa?

Esto completa automáticamente la backup pero no up :

cd /a/different/dir git --git-dir=/path/to/backup/.git ba

Esto se completa automáticamente con comandos git estándar pero no con backup :

complete -o bashdefault -o default -o nospace -F __git_wrap__git_main up

Edición : Etan tiene razón, la función de finalización necesita ver el alias expandido, así que he creado lo siguiente:

CompletableAlias() { if (($#<2)); then return 1 fi source_c="$1" target_c="$2" target_a=( "${@:2}" ) target_s="${target_a[*]}" alias "${source_c}=${target_s}" completion_modifier="__${source_c}_completion" completion_original="$( complete -p "$target_c" 2>/dev/null | sed ''s/.*-F/W/+/(/w/+/).*//1/'' )" if [[ -n "$completion_original" ]]; then read -r -d '''' completion_function <<-EOF function $completion_modifier() { COMP_LINE="/${COMP_LINE/#${source_c}/${target_s}}" ((COMP_POINT+=${#target_s}-${#source_c})) ((COMP_CWORD+=${#target_a[@]}-1)) COMP_WORDS=( ${target_a[@]} /${COMP_WORDS[@]:1} ) $completion_original } EOF eval "$completion_function" completion_command="$( complete -p "$target_c" | sed "s/${completion_original}/${completion_modifier}/; s//w/+/$/${source_c}/" )" $completion_command fi } source "/usr/share/bash-completion/completions/git" CompletableAlias "up" "git" "--git-dir" "/path/to/backup/.git"

Pero hay problemas inexplicables:

  • up bac<Tab> no funciona
  • up <Tab> usa la terminación predeterminada y no enumera los subcomandos de git
  • y muchos más ...

Edición 2 : se actualizó la secuencia de comandos para solucionar los problemas mencionados anteriormente utilizando las sugerencias de Re: Bash para completar los comandos con alias . Aparentemente esta es una tarea bastante común. Sin embargo ahora estoy corriendo en este mensaje de error:

$ cd /a/different/dir $ up backup<Tab> fatal: Not a git repository (or any of the parent directories): .git