Eu só quero obter uma lista de arquivos alterados entre duas revisões, o que é simples:
git diff -–name-only commit1 commit2 > /path/to/my/file
Mas, o que devo escrever se quiser copiar todos os arquivos listados para outro local? E eu preciso de uma estrutura de diretório completamente idêntica para arquivos copiados.
Por exemplo, eu modifiquei e adicionei arquivos:
/protected/texts/file1.txt
/protected/scripts/index.php
/public/pics/pic1.png
Eu quero ter em /home/changes/
todos os arquivos alterados e adicionados:
/home/changes/protected/texts/file1.txt
/home/changes/protected/scripts/index.php
/home/changes/public/pics/pic1.png
git format-patch
pode fazer isso para intervalos de confirmação.git diff commit1 commit2 > my.patch
e depoiscd other/path; patch -p1 < my.patch
. Por que isso precisa ser feito com cópias completas dos arquivos? Se é porque você acha que o patch pode não se aplicar, e, portanto, o outro diretório não está realmente nocommit1
estado, você realmente deveria copiar tudo docommit2
estado ...Respostas:
Tente o seguinte comando, que eu testei:
fonte
cp --parents
dica, eu queria essa opção há anos e nunca soube que ela existia! ..obviamente, eu nunca me preocupei em procurá-lo também = \--parents
opção decp
não está disponível.IFS=$'\n'
primeiro pode fazê-lo. (De preferência em um subnível de modo a não atrapalhar o seu valor IFS original).cp: cannot stat 'git diff --name-only': No such file or directory
no git bash no Windows. O que estou fazendo de errado? Diretório de destino existeO seguinte deve funcionar bem:
Para explicar mais:
O
-z
to comgit diff --name-only
significa produzir a lista de arquivos separados por bytes NUL em vez de novas linhas, apenas no caso de seus nomes de arquivos terem caracteres incomuns.O
-0
toxargs
diz para interpretar a entrada padrão como uma lista de parâmetros separados por NUL.A
-IREPLACE
é necessária uma vez por padrãoxargs
iria acrescentar os parâmetros para o final dorsync
comando. Em vez disso, diz para colocá-los onde mais tardeREPLACE
estiver. (Essa é uma boa dica desta resposta de falha no servidor .)O
-a
parâmetro pararsync
significa preservar permissões, propriedade etc., se possível. Os-R
meios para usar o caminho relativo completo ao criar os arquivos no destino.Atualização: se você possui uma versão antiga
xargs
, precisará usar a-i
opção em vez de-I
. (O primeiro foi descontinuado em versões posteriores dofindutils
.)fonte
xargs --version
diz?-i
, o que é preterido nas versões posteriores - o 4.1 é bastante antigo agora. Vou atualizar minha resposta.-I
em algumas versões, então talvez tente-I REPLACE
.-I
é suportado apenas desdefindutils
4.2.10, lançado em dezembro de 2004.--diff-filter=d
para excluir arquivos excluídos da lista. Caso contrário, você receberá erros ao tentar copiá-los para a pasta de alterações. Caso contrário, ótima resposta. Obrigado!Aqui está uma frase:
Listar arquivos alterados e compactá-los como * .zip:
Listar os últimos arquivos alterados confirmados e compactá-los como * .zip:
fonte
sed.exe
? Aindazip
não estou sendo encontrado no Windows.PATH
variável env.fonte
https://stackoverflow.com/users/79061/sebastian-paaske-t%c3%b8rholm
fonte
Funciona perfeitamente.
fonte
Ninguém mencionou o
cpio
que é fácil de digitar, cria links físicos e manipula espaços nos nomes de arquivos:fonte