aplica um comando específico para cada repositório git

1

Eu quero comprimir todos os repositórios git no meu computador (digamos em ~ ). Ou seja, para cada diretório {} , que contém o diretório ou arquivo (no caso de submódulos) chamado .git , eu quero executar git gc --aggressive --git-dir={} .

Eu tentei o seguinte:

/bin/find /c/libs/boost/ -name '.git' -print -exec git --git-dir=dirname {} gc --aggressive \;

mas a saída consiste em uma abundância de fatal: Not a git repository: 'dirname /c/libs/boost/.git' etc. O que devo fazer para usar o comando dirname corretamente? Ou algo mais para alcançar o efeito desejado?

    
por Orient 26.12.2013 / 20:28

3 respostas

2

Você está passando a palavra dirname como o argumento para --git-dir .

Com o GNU ou FreeBSD find, a ação -execdir executa um comando no diretório que contém o arquivo correspondente.

find /c/libs/boost/ -name '.git' -execdir git gc --aggressive \;

Se o seu comando find não tiver -execdir , você pode passar o diretório .git como um argumento para --git-dir .

find /c/libs/boost/ -name '.git' -exec git --git-dir {} gc --aggressive \;

Em geral, se você precisar de expansão de shell, invoque um shell explicitamente, com sh -c 'shell command' . Não tente executar nenhuma interpolação no comando shell, pois isso falharia com nomes de arquivos contendo caracteres especiais. Passe a (s) correspondência (s) como um argumento para o shell script. Observe que, após sh -c 'shell command' , o primeiro argumento é $0 e os outros argumentos ( $1 , $2 ,…) formam coletivamente "$@" .

find /c/libs/boost/ -name '.git' -exec sh -c 'cd "${0%/.}" && git gc --aggressive' {} \;
find /c/libs/boost/ -name '.git' -exec sh -c 'for dir; do cd "${dir%/.}" && git gc --aggressive' _  {} +
    
por 27.12.2013 / 01:39
1
for location in $( find -type d -name .git /path/to/base/of/search ); do
    if pushd "$location/.."; then
        git gc --aggressive --git-dir=.
        popd
    fi
done
    
por 26.12.2013 / 20:31
1

Eu encontrei a solução (funciona em msys ):

/bin/find /c/libs/boost/ -name '.git' -print -exec bash -c 'cd $(dirname {}) ; git gc --aggressive' \; 2>&1 | tee git-gc.log
    
por 26.12.2013 / 20:47