Git: copie todos os arquivos em um diretório de outra ramificação

189

Como copiar todos os arquivos em um diretório de outra ramificação? Eu posso listar todos os arquivos nesse diretório fazendo

git ls-tree master:dirname

Eu posso copiar todos os arquivos individualmente fazendo

git checkout master -- dirname/filename

No entanto, o uso de curingas até agora foi uma falha total. Isso não faz nada:

git checkout master -- dirname/*.png

Embora eu acho que posso usar um script bash para fazer isso, tem que haver uma maneira mais fácil, certo?

alexenko
fonte

Respostas:

289

Como você não está tentando mover os arquivos na árvore, você deve apenas verificar o diretório:

git checkout master -- dirname
CB Bailey
fonte
2
E se eu quisesse reter mensagens de confirmação para os arquivos copiados?
totels 19/04/11
2
@totels, a rigor, não há mensagens de confirmação associadas aos arquivos; a mensagem de confirmação está associada ao próprio objeto de confirmação. Isto é o que eu acho que você quer: git checkout master -- dirname; git add dirname; git commit -c $COMMIT_SHA1 --reset-author;onde $COMMIT_SHA1poderia ser branch_ae seria o objeto de confirmação que tem a mensagem de confirmação que você deseja. Eu não sei de antemão como determinar programaticamente o commit com a alteração mais recente paradirname
Alexander Bird
1
Isso tem um efeito colateral muito estranho. Ele copia dirnamemais, mas também copia quaisquer arquivos que estão no .gitignoredo masterramo. Alguma idéia do porquê disso?
Milimetric
4
Outro efeito colateral, acho que se o ramo atual tiver arquivos adicionais que não estão no ramo do qual você está fazendo check-out (em uma determinada pasta de destino), basicamente os mesclará - talvez seja apenas se alguém é um ancestral? Não tenho exatamente certeza das condições, mas se você tiver 20 arquivos na ramificação A e 20 na ramificação B e apenas 10 deles tiverem o mesmo nome, você terá 30 arquivos (pelo menos no caso em que a ramificação A é o ancestral do ramo B)
codercake
@totels confira o comando git cherry-pick. Ele aplica confirmações de outras ramificações, mas apenas os arquivos que foram alterados nas confirmações que você deseja.
CS01
18

Se não houver espaços nos caminhos e você estiver interessado, como eu estava, apenas em arquivos de extensão específica, poderá usar

git checkout otherBranch -- $(git ls-tree --name-only -r otherBranch | egrep '*.java')
test30
fonte
4
É uma pena que o git não suporte essa função diretamente. Exatamente como o OP, eu teria pensei que seria algo comogit checkout master -- *.c
Gregory Kuhn
1
Esta resposta me ajudou a responder "Como posso fazer check-out de arquivos de um determinado padrão de outra ramificação para minha ramificação atual?"
ΕΨΗΕΛΩΝ usr-local-