git revisão de checkout - * partial / path *? (por exemplo, use pathspec com git checkout de commit específico)

0

Para fazer o checkout de qualquer arquivo com "partial / path" em seu caminho + nome de HEAD:

git checkout *partial/path*

Para fazer o checkout de arquivos de commits específicos (o -- é opcional aqui):

git checkout abcde -- full/path/to/my/file full/path/to/another/file

Contraintuitivamente, o comando a seguir faz não fazer o checkout de arquivos que correspondem ao pathspec no commit especificado:

git checkout abcde -- *partial/path*

Em vez disso, resulta em error: pathspec '*partial/path*' did not match any file(s) known to git.

Minha pergunta é: É possível usar um pathspec para fazer o check-out de vários arquivos usando pathspec de uma confirmação específica?

Observação: percebo que git checkout branch file é provavelmente um comando completamente diferente de git checkout pathspec (e também completamente diferente de git checkout branch ), o que pode explicar por que o pathspec não funciona aqui.

Observação: o alias a seguir só resolve parcialmente o problema:

[alias] ccps = "!f() { git ls-files $2 | xargs -I {} git checkout $1 -- \"{}\"; }; f"

Isso falha quando um ou mais arquivos foram adicionados ou removidos, correspondendo o pathspec entre a confirmação atual e a confirmação de destino.

UPDATE: O seguinte apelido (tipo de) faz o que eu quero:

[alias] ccps = "!f() { git ls-tree -r --name-only $1 | grep $2 | xargs -I {} git checkout $1 -- {}; }; f"

Problemas com esta solução:

  • grep $2 não é o mesmo que um pathspec (não funcionará com . e .. e * ).
  • É bastante lento (demorou ~ 5 segundos para sequencialmente git checkout 57 arquivos retornados de grep ).

Mas, ao mesmo tempo, agora tenho acesso à regex, o que é uma vantagem.

    
por Hau 04.08.2016 / 17:43

1 resposta

0

Geralmente, os curingas são expandidos pelo shell no sistema de arquivos ao vivo. Para passá-las diretamente para o Git, escaneie ou cite o pathspec, ou seja, \*partial/path\* ou "*partial/path*" . Dessa forma, a expansão será feita pelo próprio git e contra o commit fornecido.

    
por 04.08.2016 / 18:21

Tags