Como mover um repositório git para outro diretório e tornar esse diretório um repositório git?

101

Eu tenho um diretório gitrepo1 . Este diretório é um repositório git.

  • Eu gostaria de mover este gitrepo1 para outro diretório newrepo .

  • O diretório newrepo deve ser o novo repositório git sem perda do histórico do git e deve conter o diretório gitrepo1 .

  • O diretório gitrepo1 deve ser apenas um diretório agora (dentro de newrepo ), sem nenhum .gitíndice, ou seja, NÃO deve mais ser um repositório git independente ou um submódulo.

Como posso fazer isso?

Pranjal Mittal
fonte
9
mv girepo1 newrepo??
ddavison

Respostas:

109

É muito simples. O Git não se preocupa com o nome de seu diretório. Ele só se importa com o que está dentro. Então você pode simplesmente fazer:

# copy the directory into newrepo dir that exists already (else create it)
$ cp -r gitrepo1 newrepo

# remove .git from old repo to delete all history and anything git from it
$ rm -rf gitrepo1/.git

Observe que a cópia é bastante cara se o repositório for grande e com um longo histórico. Você também pode evitá-lo facilmente:

# move the directory instead
$ mv gitrepo1 newrepo

# make a copy of the latest version
# Either:
$ mkdir gitrepo1; cp -r newrepo/* gitrepo1/  # doesn't copy .gitignore (and other hidden files)

# Or:
$ git clone --depth 1 newrepo gitrepo1; rm -rf gitrepo1/.git

# Or (look further here: http://stackoverflow.com/q/1209999/912144)
$ git archive --format=tar --remote=<repository URL> HEAD | tar xf -

Depois de criar newrepo, o destino a gitrepo1ser colocado pode ser em qualquer lugar, mesmo dentro, newrepose você quiser. Isso não muda o procedimento, apenas o caminho que você está escrevendo de gitrepo1volta.

Shahbaz
fonte
6
+1. Provavelmente vale a pena mencionar que isso afetou os repositórios criados com o git versão 1.7.8 ou 1.7.9 - o que pode significar que mover um repositório git o torna inutilizável (embora, como indicado, seja facilmente corrigido).
AD7six
1
Estou na máquina wndows e usando o prompt de comando. Não consegui encontrar o comando "cp". é o comando "cp" específico para outro sistema operacional?
LP13
1
@ user3862378,, cpcomo quase todo comando ou função é específico para outros sistemas operacionais. Na verdade, é específico para cada sistema operacional que não seja o Windows. Tente ligar para a microsoft e perguntar por que eles não são POSIX. De qualquer forma, cpsignifica copiar. mvsignifica movimento. rmsignifica remover. Você pode encontrar equivalentes do Windows.
Shahbaz
@Shahbaz Obrigado, a solução acima cria a seguinte estrutura "newrepo ->. Git" e "newrepo-> todos os outros arquivos de gitrepo1" ... não é colocar a pasta "gitrepo1" dentro de "newrepo" .. Estou curioso para saber se criar pastas manualmente no Windows e mover a pasta ".git" para a pasta raiz ... funcionaria sem afetar o histórico?
LP13
2
@ user3862378, não há razão para que não deva. .git/contém todo o histórico, que inclui seu último commit. Onde quer que você coloque, você tem toda a história. Na verdade, se todos os arquivos nesse diretório forem diferentes do repositório original de onde você tirou .git/, a única coisa seria que ele informa que alguns arquivos foram excluídos e alguns não rastreados estão presentes. Com um git reset --hard, os arquivos removidos seriam recuperados automaticamente! A única coisa a notar é que apenas copiando .git/você não pode recuperar as alterações não confirmadas.
Shahbaz
4

É um pouco tarde e a pergunta já está respondida mas, para fazê-lo sem dor de cabeça:

  1. Verifique qual é o branch atual em que você está na pasta git mais antiga git status, digamos, desenvolvimento de branch
  2. Mude o diretório para a nova pasta git e, em seguida, git cloneo projeto do repo para a nova pasta
  3. Verifique o branch atual em sua nova pasta: git checkout development
  4. Sincronize sua nova pasta com a anterior, usando rsync, excluindo a pasta .git :rsync -azv --exclude '.git' gitrepo1 newrepo/gitrepo1

Então você é bom para continuar de onde parou

Emremrah
fonte
1

É ainda mais simples do que isso. Apenas fiz isso (no Windows, mas deve funcionar em outro sistema operacional):

  1. Crie um novo repo .
  2. Mova gitrepo1 para newrepo .
  3. Mova .git de gitrepo1 para newrepo (um nível acima).
  4. Confirme as alterações (corrija o rastreamento conforme necessário).

Git apenas vê que você adicionou um diretório e renomeou um monte de arquivos. Não é nada demais.

david.pfx
fonte
1

Não sou especialista, mas copio a pasta .git para uma nova pasta e invoco: git reset --HARD

Reinicie o universo
fonte