O git tem algo como `svn propset svn:keywords` ou ganchos pré/pós-confirmação?

StackOverflow https://stackoverflow.com/questions/39742

  •  09-06-2019
  •  | 
  •  

Pergunta

Navegando pela documentação do git, não consigo ver nada análogo aos ganchos de commit do SVN ou aos recursos "propset" que podem, digamos, atualizar um número de versão ou aviso de direitos autorais dentro de um arquivo sempre que ele for confirmado no repositório.

Espera-se que os usuários do git escrevam scripts externos para esse tipo de funcionalidade (o que não parece fora de questão) ou acabei de perder algo óbvio?

Editar :Só para deixar claro, estou mais interessado em, por exemplo,

svn propset svn:keywords "Author Date Id Revision" expl3.dtx

onde uma string como esta:

$Id: expl3.dtx 780 2008-08-30 12:32:34Z morten $

é mantido atualizado com as informações relevantes sempre que ocorre um commit.

Foi útil?

Solução

Citando do Perguntas frequentes sobre Git:

O git tem expansão de palavras-chave?

Não recomendado.A expansão da palavra -chave causa todo tipo de problemas estranhos e não é realmente útil, especialmente no contexto de um SCM.Fora do Git, você pode executar a expansão das palavras -chave usando um script.O script de exportação do kernel Linux faz isso para definir a variável extra_version no makefile.

Veja gitattributes(5) se você realmente quiser fazer isso.Se sua tradução não for reversível (por exemplo, expansão das palavras -chave SCCS), isso pode ser problemático.

Outras dicas

Eu escrevi um resposta bastante completa para isso em outro lugar, com código mostrando como fazer isso.Um resumo:

  1. Você provavelmente não quer fazer isso.Usando git describe é uma alternativa razoável.
  2. Se você precisar fazer isso, $Id$ e $Format$ são bastante fáceis.
  3. Qualquer coisa mais avançada exigirá o uso gitattributes e um filtro personalizado.Eu forneço um exemplo de implementação de $Date$.

Soluções baseadas em funções de gancho geralmente não são úteis, porque sujam sua cópia de trabalho.

O Git possui ganchos de pré-commit e pós-commit, eles estão localizados dentro de cada diretório .git/hooks.Basta modificar os arquivos e chmodá-los para torná-los executáveis.

Talvez a propriedade SVN mais comum, 'svn:ignore', seja feita por meio do arquivo .gitignore, em vez de metadados.Receio não ter nada mais útil para os outros tipos de metadados.

Embora seja uma pergunta e resposta antiga.Pensei em jogar um, já que isso está me incomodando há muito tempo.

Estou acostumado a listar os arquivos em um diretório em ordem reversa (engraçado, hein?).O motivo é que eu gostaria de ver quais arquivos eu (ou qualquer outra pessoa) alterei recentemente.

O Git vai atrapalhar meus planos porque, ao mudar de branch, o repositório local substituirá completamente os arquivos rastreados do (incremental...Eu sei...) cópias que ficam no repositório local compactado.

Desta forma, todos os arquivos que foram retirados terão o carimbo de data e hora do checkout e não refletirão a hora da última modificação.....Que chato.

Então, eu desenvolvi uma linha única no bash que atualizará uma propriedade $Date:$ dentro de qualquer arquivo COM A HORA DA ÚLTIMA MODIFICAÇÃO DE ACORDO COM O QUE TEM NO SISTEMA DE ARQUIVOS de modo que terei um status imediato informando a última modificação sem ter que navegar no git log , git show ou qualquer outra ferramenta que forneça os tempos de commit em culpa modo.

O procedimento a seguir modificará $Date:$ palavra-chave apenas em arquivos rastreados que serão confirmados no repositório.Ele usa git diff --name-only que listará os arquivos que foram modificados e nada mais....

Eu uso essa linha manualmente antes de confirmar o código.Uma coisa, porém, é que preciso navegar até o diretório raiz do repositório antes de aplicar isso.

Aqui está a variante de código para Linux (colada como multilinha para facilitar a leitura)

git diff --name-only | xargs stat -c "%n %Y" 2>/dev/null | \
perl -pe 's/[^[:ascii:]]//g;' | while read l; do \
   set -- $l; f=$1;  shift; d=$*; modif=`date -d "@$d"`; \
   perl -i.bak -pe 's/\$Date: [\w \d\/:,.)(+-]*\$/\$Date: '"$modif"'\$/i' $f; \
   git add $f; done

e OSX

git diff --name-only | xargs stat -f "%N %Sm" | while read l; do \
   set -- $l; f=$1; shift; d=$*; modif=`date -j -f "%b %d %T %Y" "$d"`; \
   perl -i.bak -pe 's/\$Date: [\w \d\/:,.)(+-]*\$/\$Date: '"$modif"'\$/i' $f; \
   git add $f; done
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top