Meu repositório Git está no diretório raiz errado. Posso mover? (../ ao invés de ./)

118

De alguma forma, quando git initeditei meu projeto mais recente há cerca de um mês, executei o comando no diretório um diretório acima da raiz do meu projeto.

Portanto, meu repositório está no ./projectdiretório e não no ./project/my-new-projectdiretório. Não sei como não percebi o problema antes, mas nunca procurei o diretório .git até agora.

Existe uma maneira, sem matar meu projeto, de mover o repositório para o diretório apropriado e então dizer ao git qual é a nova base do projeto? Apenas mover o diretório não funciona. Git acha que todos os arquivos foram excluídos.

Mike
fonte

Respostas:

19

Provavelmente a coisa mais simples, a menos que você já tenha criado algum histórico que deseja salvar, seria apenas deletar o .gitsubdiretório e refazer o init no diretório correto.

Se você usou o git para resolver o problema, qualquer solução necessariamente deixaria para trás muitas entradas de histórico "movido este arquivo aqui" que não são realmente mudanças, mas você consertou um erro na hora da criação. Melhor apenas criar da maneira certa.

TED
fonte
2
Eu vejo o que você está dizendo, mas qualquer ação in-git que você fizer para corrigir isso vai acabar deixando um monte de histórias "movido este arquivo aqui" que não são realmente mudanças, mas você consertou um erro no momento da criação. Melhor apenas criar da maneira certa.
TED de
8
Isso quebra muitas coisas. stackoverflow.com/a/3247756/825364 é uma maneira muito melhor de fazer isso.
Steve Tauber
2
Bem, salvar um pouco de histórico é a função do Git. Talvez devêssemos apenas excluir o subdiretório .git e desinstalar o Git de nosso sistema. Usar um servidor ftp em vez de vcs é provavelmente a coisa mais simples, afinal!
Gherman
2
a resposta abaixo é uma abordagem muito melhor, pois retém toda a história
BigMikeW
2
Então, para mim, eu fiz isso e imediatamente percebi meu erro. sem ter que se preocupar com nenhuma mudança, esta é a maneira mais fácil de voltar para uma lousa limpa.
Mike
261

Eu tive o problema oposto - tive que mudar a raiz git para o diretório pai (de projeto / src para projeto) Para minha extrema surpresa, o seguinte funcionou !!

src$ mv .git ../ 
src$ cd ..
project$ git add src
project$ git commit -a

git habilmente detectou que todos os novos arquivos foram renomeados como versões dos antigos e nenhum histórico foi perdido

Você pode tentar algo semelhante ... mova a pasta .git e adicione os arquivos novamente antes de enviar

Abhishek Anand
fonte
8
Isso funcionou perfeitamente para mim. Também movi outros arquivos de configuração .git * do diretório como .gitigore
Relequestual
7
Meu caro senhor, você é um salvador de vidas. Essa coisa realmente FUNCIONA. Obrigado.
Radu Murzea
1
Além disso, eu git rm'dos arquivos de seu local antigo, então git status(corretamente) acabei relatando uma série de operações de renomeação. Quanto mais trabalho com o git, mais gosto dele.
ssc
7
@Mike isto deve ser marcado como a resposta aceita. É a solução preferida para reiniciar porque você não perde a história. Se você não acredita em mim, a contagem de votos positivos fala por si.
Joseph Spens de
3
Obrigado! Funcionou para mim, mas tive que fazer mais algumas coisas: 1. Antes de enviar, atualizei .gitignoree executei git add -Aa pasta raiz; depois disso, o git exibiu corretamente todos os arquivos como em renamedvez de deleted. 2. Como uso submódulos, tive que mover .gitmodulespara a nova raiz e atualizar o caminho do submódulo nos vários arquivos de configuração git. Para descobrir quais arquivos modificar eu corrigrep -nrI --color 'old/path/to/submodule' .
Guido Walter Pettinari
43

Isso funcionou para mim e manteve toda a minha história intacta. Na pasta raiz incorreta (o pai onde você inicializou acidentalmente o repo):

Mova a pasta:

mv .git thecorrectfolder/

Reinicialize o repo git:

cd thecorrectfolder/
git init

Adicione novamente todos os arquivos, confirme e envie:

git add .
git commit -am 'fixing things'
git push origin master

Feito! Pegue uma cerveja.

Ao confirmar o repositório git após a reinicialização, você obterá uma série de saídas parecidas com estas:

rename {ethanode/coffee => coffee}/app.coffee (100%)

Em outras palavras, todas as suas referências da pasta pai e sendo renomeadas para usar a pasta correta.

holmesal
fonte
Obrigado! Esse método era exatamente o que eu precisava!
Giel Berkers
Isso funcionou para mim, mas era um pouco feio. No que diz respeito ao git, eu não "movi" nada, apenas apaguei centenas de arquivos e adicionei centenas de outros arquivos idênticos.
bjmc
6
git init não é necessário e a parte restante é igual à minha resposta, que foi enviada anos antes da sua: stackoverflow.com/a/3247756/391753
Abhishek Anand
35

git filter-branchpermite que você reescreva a história dessa maneira. A git filter-branchpágina de manual ainda tem seu caso como exemplo :

Para reescrever o repositório para parecer que foodir / foi a raiz do projeto e descartar todas as outras histórias:

git filter-branch --subdirectory-filter foodir -- --all

Você provavelmente deseja colocar git cloneo repo em um novo subdiretório antes (ou depois?) Da git filter-branchexecução. (A clonagem antes da ramificação do filtro e a execução da ramificação do filtro no novo clone teria a vantagem de deixar o .git/diretório original como um backup, caso algo dê errado.)

ndim
fonte
1
Isso não "descarta todos os outros históricos " (sugerindo que o .gitrepo permanece no nível superior enquanto os subdiretórios se tornam "considerados como a raiz") - isso literalmente descartará todos os outros arquivos no repo e moverá todos os subdirectory/*arquivos para a pasta raiz .
Louis Maddox
Ótima resposta, mas lembre-se de que se houver um arquivo .gitignore (se rastreado), ele será perdido com esta operação. Além disso, você precisará fazer um git push --forcepara atualizar o repositório upstream depois disso.
waldyrious
12

Git pode lembrar de arquivos com seus hashes,

Basta mover o .gitdiretório raiz e dizer gitpara lembrar de todas as alterações de arquivos com --allopção.

$ mv .git ../
$ cd ..
$ git add . --all 
$ git status // => you can see all the files recognized as renamed 100%
$ git commit -m "Moves repo to root directory."
M. Reza Nasirloo
fonte
3

Use git-mvpara mover seus arquivos "para cima" para o local apropriado e, em seguida, para git-rmo diretório "meu-novo-projeto".

jkndrkn
fonte
É o contrário. Não quero mover todos os meus arquivos para o diretório onde o git está (há toneladas de outras coisas lá ... seria irritante) e depois mover o git para cima. Quero mover o repositório para o diretório raiz do meu projeto.
Mike
2

Eu vim aqui procurando uma maneira de mover meu repositório para qualquer lugar .

No caso, eu não fui o único, aqui está o que fiz no final:

https://git.wiki.kernel.org/index.php/GitFaq#How_do_I_clone_a_repository_with_all_remotely_tracked_branches.3F Eu "git clone --mirror" da cópia nua do meu repo e depois disse para não estar mais vazio, então os arquivos apareceram nessa nova pasta. (Em seguida, verifiquei se os arquivos e o log haviam aparecido ou não.) Mantive o repositório antigo por um tempo, apenas para garantir ...

Dessa forma, consegui mover meu repo sem perder histórico.

Saudações, Dinah

user1565849
fonte
Corrija-me se eu estiver errado, mas parece que você poderia ter feito isso simplesmente movendo o diretório do repositório para sua posição designada usando apenas ferramentas de sistema de arquivos, como mv /path/to/the/old/location/of/the/repo /path/to/the/new/location/of/the/repo.
cueedee
2

Tendo acabado de passar por este mesmo problema, minha solução final foi:

  1. Mova a pasta .git para onde ela precisava estar.
  2. Mude o diretório para a pasta para a qual acabei de mover .git
  3. Redefina o conteúdo da pasta para o que o git acha que deveria ser: git reset --hard HEAD
  4. Verifique se o conteúdo corresponde ao que deveria ser com o kdiff3 ou outra ferramenta de comparação
  5. Exclua os arquivos agora sem versão no local antigo.

Funcionou como mágica, sem impacto na história. - NB: Se você fez algumas alterações, certifique-se de confirmá-las antes de mover o diretório .git.

Steve Barnes
fonte
-3

Existem duas maneiras aqui:

  1. cd TheWrongDirectory rm -rf .git

  2. apenas EXCLUA a pasta .git e coloque o CD no diretório correto.

V. Rance
fonte