[1.0.0] - 2026-09-04
Primeira versão estável. Fecha o roteiro pré-1.0: a superfície de comandos e
o formato do aliases.gitconfig congelam aqui — a partir desta tag, as
regras de MAJOR/MINOR/PATCH do ADR-0003
passam a valer integralmente.
Adicionado
- Completions de
git aliaspara bash e zsh (completions/git-alias.bash,
completions/git-alias.zsh). Completam os subcomandos (help,
--version/-v,--list,--export,--import,--unset,--rename,
--doctor), as flags de cada um (--list→--file,--origin/-o;
--import→--overwrite,--dry-run) e nomes de alias já definidos em
git alias <nome>,--unset <TAB>e o<velho>de--rename. bash: a
função_git_alias, carregada sob demanda pela completion do próprio Git
(git-completion.bash). zsh: a função_git-alias, que o_gitnativo
procura para o subcomandoalias— sembashcompinit. Oinstall.sh
agora tem um 4º passo que faz o symlink das duas para os diretórios de
completion do usuário (bash: dir do dynamic loader dobash-completion;
zsh: um dir desite-functions, comPENDENTEorientando o$fpath).
tests/completions.shcobre a existência, a sintaxe e a cobertura de
subcomandos/flags dos dois arquivos. git alias --import <arquivo>(-= entrada padrão): funde as entradas
alias.*de uma fonte gitconfig (tipicamente a saída de um--export) na
seção[alias]do arquivo de aliases versionado detectado, sem destruir o
que já está lá — o inverso não-destrutivo do--export. Colisão de valor:
pula e relata por padrão (4 importados; 2 já existentes com valor diferente: co, st (use --overwrite));--overwritefaz a fonte vencer;
valor idêntico dos dois lados é no-op silencioso.--dry-runimprime o
resumo sem gravar. Uma entrada com nome reservado (help), nome inválido,
ou múltiplos valores para a mesma chave (a condição que--renamerecusa)
é ignorada com aviso, sem bloquear as demais;alias.aliasé omitido,
como no--export. Não toca nogit config --global; sem arquivo
versionado detectado é erro (exit 1), não fallback. Avisa (stderr) quando
algum alias importado tem valor começando por!— executa shell ao ser
invocado, e importar de fonte não confiável equivale a executar comando
arbitrário depois. Ver
ADR-0004.git alias --doctor: relatório read-only de diagnóstico da instalação (o
inverso doinstall.sh) — confere se o arquivo de aliases versionado está
noinclude.pathe é detectável (com a resolução do caminho: absoluto,
~/…, relativo a$HOME, cadeia de symlinks), se há aliases nogit config --globalfora dele (não versionados / risco de sombra), se
há umgit-aliasnoPATHe se sobrou umalias.aliaslegado sombreando
o script. Sai1se encontra algo que impedegit aliasde funcionar como
esperado (linhaerro:),0caso contrário (aviso:não afeta o código).git alias --rename <velho> <novo>: renomeia um alias preservando o valor
exato (newlines internas do corpo inclusive), no lugar de
git alias novo "$(...)" && git alias --unset velho.git alias --list --file: restringe a listagem aos aliases presentes no
arquivo de aliases incluído.git alias --list --origin(também:-o): marca a origem de cada alias
listado (arquivo:<caminho>,--globalououtro:<origem>), no espírito
degit config --show-origin.- Guardas ao criar um alias (e no destino de
--rename): recusa nome
inválido ou o nome reservadoalias; avisa (sem recusar) quando o nome
sombreia um comando builtin do Git. - Seção "Códigos de saída" no README, documentando o contrato 0/1/2.
Corrigido
Achados e corrigidos ainda durante o desenvolvimento desta versão — não
chegaram a afetar nenhuma versão publicada antes desta:
git alias --list(e--list --origin) migrou o parsing paragit config --name-only --get-regexp+ consulta por chave, o mesmo saneamento
já aplicado ao--export: um alias com valor multilinha não corrompe
mais a listagem, e cada linha física do valor carrega o rótulo de origem
correto. A falha ao consultar um alias que sumiu entre a enumeração e a
consulta (ex.: removido por outro processo) não aborta mais a listagem —
a entrada é pulada e o resto sai normalmente.git alias --unsetrecusa o nome reservadoalias/help, mesma guarda
já aplicada à criação e ao--rename— sem ela,--unset aliasapagava
silenciosamente a entrada que fazgit aliasfuncionar como subcomando
do Git.--liste--renameagora avisam/recusam corretamente quando uma chave
alias.Xtem mais de um valor na mesma camada (ex.:git config --add
usado por fora do script), inclusive quando a multiplicidade só aparece
no fallback XDG do config global ($XDG_CONFIG_HOME/git/config) ou
está dividida entre~/.gitconfige esse fallback ao mesmo tempo —
cenário em que--renamechegava a gravar só o último valor sob o novo
nome e descartar os demais.--unset,--renamee a criação de alias agora alcançam e limpam
consistentemente um alias que more só no fallback XDG do config global,
que algumas versões do Git não enxergam via--get/--unset-allmesmo
a leitura mesclada enxergando os dois arquivos;GIT_CONFIG_GLOBAL=""
(isolamento deliberado de ambiente, usado em teste/sandbox) desliga esse
fallback também, como o próprio Git faz.- Mensagens de erro mais precisas quando uma remoção ou limpeza de cópia
obsoleta falha por um motivo genuíno (lock, permissão) em vez de "a
chave não existe" —--unset,--renamee a criação de alias agora
distinguem esse caso e apontam a causa real, em vez de anunciar sucesso
ou reportar "não existe" indevidamente.
Alterado
- Contrato de códigos de saída (agora documentado no README, seção "Códigos
de saída"): consulta de alias inexistente,--unsetde alias ausente,
--renamede alias ausente/para destino já existente, e uma limpeza de
cópia obsoleta que falha por um motivo genuíno (lock, permissão) agora
retornam1— antes,0com só um aviso em stdout/stderr, mesmo quando
o alias ficava sombreado ou duas definições coexistindo.git alias help
com argumentos extras (forma não documentada) passa a retornar2(erro
de uso) em vez de0. - Layout do repositório, reorientado para ferramenta instalável
(ADR-0002):
git/bin/git-alias→bin/git-alias;git/aliases.gitconfig(o arquivo
de aliases do próprio autor, usado como exemplo) →examples/aliases.gitconfig,
amostra do formato — não é mais o alvo doinstall.sh. git alias --doctor: seção[git/bin no PATH]renomeada para
[git-alias no PATH]— o diretóriogit/bindeixou de existir; a seção
descreve a mesma checagem (umgit-aliasnoPATHque resolve para o
script). Texto informativo, não contrato de máquina.install.shdeixa de gravarinclude.pathapontando para um arquivo
dentro do clone. Segit alias --doctorjá detecta um arquivo de aliases
versionado (em qualquer caminho), não mexe em nada; senão, cria um a
partir do config atual (git alias --export) em
${XDG_CONFIG_HOME:-~/.config}/git/aliases.gitconfig— fora do clone,
sobrevivendo a um reclone/git pullda ferramenta — e adiciona esse ao
include.path.