comando git para mover uma pasta para dentro de outra

193

Eu criei uma pasta commoncom vários arquivos e pastas de origem.

Agora eu quero mover a commonpasta para dentro da includepasta para que pareçainclude/common

Eu tentei estes:

  1. git add include

  2. git mv common/ include/

    mas falha com este erro

    fatal: fonte ruim, fonte = myrepo / common, destino = myrepo / include

  3. Eu tentei, git mv common/ include/commonmas recebo o mesmo erro

Alguma idéia de como conseguir isso?

lurscher
fonte

Respostas:

177

Uma das coisas mais legais sobre o git é que você não precisa rastrear os nomes dos arquivos explicitamente. O Git descobrirá isso comparando o conteúdo dos arquivos.

Portanto, no seu caso, não trabalhe tanto:

$ mkdir include
$ mv common include
$ git rm -r common
$ git add include/common

A corrida git statusdeve mostrar algo assim:

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    common/file.txt -> include/common/file.txt
#
Andres Jaan Tack
fonte
43
Isso não funciona para mim (usando o Windows 7, 1.7.6.msysgit.0). O Git acha que os arquivos antigos foram excluídos e os novos foram adicionados.
Bart
Hmm, talvez o git use algum utilitário externo para determinar a uniformidade do arquivo que não funciona no Windows? Esta foi uma parte essencial da implementação do git.
Andres Jaan Tack (
13
@OliverF. Correção: git mvé equivalente.
Andres Jaan Tack
25
"Uma das coisas mais legais sobre o git" - uma das desvantagens desse recurso interessante é que ele começa a falhar quando você também modifica o arquivo que foi renomeado em uma extensão substancial, o que faz com que ele veja a exclusão e a adição de um novo arquivo , então, francamente, prefiro o suporte explícito à renomeação.
precisa
2
Se o git converter as terminações de linha, isso resultará no problema descrito por @Bart. Para que isso funcione, você deve fazer o seguinte: git config --global core.autocrlf false
Mariano Dupont
162
 git mv common include

Deveria trabalhar.

Na git mvpágina do manual :

git mv [-f] [-n] [-k] <source> ... <destination directory>

Na segunda forma, o último argumento deve ser um diretório existente; as fontes fornecidas serão movidas para este diretório .
O índice é atualizado após a conclusão bem-sucedida, mas a alteração ainda deve ser confirmada.

Não " git add" deve ser feito antes da mudança.


Nota: " git mv A B/", quando Bnão existe como diretório, deve ocorrer um erro, mas não ocorreu.

Veja commit c57f628 de Matthieu Moy ( moy) para Git 1.9 / 2.0 (primeiro trimestre de 2014):

O Git costumava aparar a barra final e tornar o comando equivalente a ' git mv file no-such-dir', que criou o arquivo no-such-dir(enquanto a barra final declarou explicitamente que só poderia ser um diretório).

Este patch ignora a remoção da barra à direita do caminho de destino.
O caminho com sua barra à direita é passado para renomear (2), que ocorre com a mensagem apropriada:

$ git mv file no-such-dir/
fatal: renaming 'file' failed: Not a directory
VonC
fonte
2
Funcionou perfeitamente - e usar git mvparece uma abordagem muito melhor!
Tomas Petricek 17/03/2015
23

Comando:

$ git mv oldFolderName newFolderName

Geralmente funciona bem.

O erro "origem incorreta ..." normalmente indica que, após a última confirmação, houve algumas renomeações no diretório de origem e, portanto, git mvnão foi possível encontrar o arquivo esperado.

A solução é simples - basta confirmar antes de aplicar git mv.

Igor Zvorygin
fonte
15

Certifique-se de ter adicionado todas as suas alterações à área de preparação antes de executar

git mv oldFolderName newFoldername

git falha com erro

fatal: bad source, source=oldFolderName/somepath/somefile.foo, destination=newFolderName/somepath/somefile.foo

se houver arquivos não adicionados, então acabei de descobrir.

Kevin Pluck
fonte
"se houver arquivos não adicionados, então acabei de descobrir." - obrigado!
cacoder
3

Outra maneira de mover todos os arquivos de um diretório para um subdiretório (mantém o histórico do git):

$ for file in $(ls | grep -v 'subDir'); do git mv $file subDir; done;

Michael Smolenski
fonte
3

Eu tive um problema semelhante com o git mvlocal em que queria mover o conteúdo de uma pasta para uma pasta existente e acabei com este script "simples":

pushd common; for f in $(git ls-files); do newdir="../include/$(dirname $f)"; mkdir -p $newdir; git mv $f $newdir/$(basename "$f"); done; popd

Explicação

  • git ls-files: Encontre todos os arquivos (na commonpasta) registrados no git
  • newdir="../include/$(dirname $f)"; mkdir -p $newdir;: Crie uma nova pasta dentro da includepasta, com a mesma estrutura de diretórios quecommon
  • git mv $f $newdir/$(basename "$f"): Mova o arquivo para a pasta recém-criada

A razão para fazer isso é que o git parece ter problemas ao mover arquivos para pastas existentes, e também falhará se você tentar mover um arquivo para uma pasta inexistente (daí mkdir -p).

O bom dessa abordagem é que ela toca apenas os arquivos que já estão registrados no git. Simplesmente usando git mvpara mover uma pasta inteira, e a pasta contém alterações sem etapas, o git não saberá o que fazer.

Depois de mover os arquivos, você pode limpar o repositório para remover quaisquer alterações não-estáveis ​​restantes - lembre-se de executar a seco primeiro!

git clean -fd -n
loket
fonte
2

Sinto muito, não tenho reputação suficiente para comentar a "resposta" de "Andres Jaan Tack".

Eu acho que meu messege será excluído ((mas eu só quero avisar "lurscher" e outros que receberam o mesmo erro: tenha cuidado ao fazer

$ mkdir include
$ mv common include
$ git rm -r common
$ git add include/common

Isso pode fazer com que você não veja o histórico git do seu projeto em uma nova pasta.

eu tentei

$ git mv oldFolderName newFolderName

obteve

fatal: bad source, source=oldFolderName/somepath/__init__.py, dest
ination=ESWProj_Base/ESWProj_DebugControlsMenu/somepath/__init__.py

eu fiz

git rm -r oldFolderName

e

git add newFolderName

e não vejo a velha história do git no meu projeto. Pelo menos meu projeto não está perdido. Agora eu tenho meu projeto em newFolderName, mas sem o histórico (

Só quero avisar, tenha cuidado usando o conselho de "Andres Jaan Tack", se você não quiser perder seu senso de humor.

Ivan F.
fonte
Verifique se todas as suas alterações foram adicionadas. O Git falha ao dizer "fonte incorreta" se houver alterações não adicionadas, então acabei de descobrir.
Kevin Arranque
0

Eu tive um problema semelhante, mas na pasta que eu queria mover, eu tinha arquivos que não estava rastreando.

digamos que eu tinha arquivos

a/file1
a/untracked1
b/file2
b/untracked2

E eu queria mover apenas os arquivos rastreados para a subpasta subdir, então o objetivo era:

subdir/a/file1
subdir/a/untracked1
subdir/b/file2
subdir/b/untracked2

o que eu fiz foi:

  • Criei uma nova pasta e movi todos os arquivos que estava interessado em mover: mkdir tmpdir && mv a b tmpdir
  • arquivos antigos git checkout a b
  • criou um novo diretório e moveu pastas limpas (sem arquivos não rastreados) para o novo subdir: mkdir subdir && mv a b subdir
  • adicionaram todos os arquivos do subdir (para que o Git pudesse adicionar apenas os arquivos rastreados anteriormente - era comum usar um truque degit add --update alteração de diretório ): (normalmente isso adicionaria arquivos não rastreados - isso exigiria a criação do arquivo)git add subdir.gitignore
  • git status mostra agora apenas arquivos movidos
  • moveu o restante dos arquivos de tmpdir para subdir: mv tmpdir/* subdir
  • git statusparece que executamos git mv:)
test30
fonte
-1

Eu resolvi isso no Windows, fazendo o seguinte:

  • Console do shell Open Power
  • dir dir
  • Clique com a tecla Alt pressionada e arraste sobre a coluna nome do arquivo / pasta e copie
  • Colar no bloco de notas ++
  • executar substituir com regex: substituir (.*)comgit mv ".\\\1" ".\\<New_Folder_Here>\"
  • copiar todo o texto do bloco de notas ++ no powershell
  • aperte enter
FalcoGer
fonte