Como faço para converter um repository git nu em normal (in-place)?

Eu tenho um repository git, mas preciso acessar e navegar pelo seu conteúdo através do ssh (em um gerenciador de arquivos como a experiência do usuário).

Eu suponho que eu poderia clonar:

git clone -l   

No entanto, meu repository tem cerca de 20 GB de tamanho e não tenho espaço para duplicá-lo. Existe uma maneira de converter o repository no local para acabar com uma cópia de trabalho?

    Nota : Eu testei isso em um repository 1-commit muito simples . Verifique isso, leia as páginas do manual e fique sempre satisfeito por ter feito o backup antes de seguir os conselhos encontrados no StackOverflow. (Você faz backup, certo?)

    Para converter um repository --bare em um não-nu:

    1. Crie uma pasta .git no nível superior do seu repository.
    2. Mova as coisas de gerenciamento de repository ( HEAD branches config description hooks info objects refs etc.) no .git você acabou de criar.
    3. Execute git config --local --bool core.bare false para converter o repository git local para não-nulo.
    4. (via comentário de Tamás Pap ) Após o passo # 3, você verá que está no branch master (ou o que o seu branch principal é) e todos os seus arquivos são deletados e a exclusão é preparada. Isso é normal. Basta fazer o checkout manualmente do master ou fazer um git reset --hard e pronto.

    Estes passos estão na direção oposta desta questão , “git-convert normal to bare repository” – note especialmente esta resposta , que afirma que os passos acima (em, presumo, qualquer direção) é diferente de fazer um git-clone . Não tenho certeza se isso é relevante para você, mas você mencionou o git clone na pergunta.

    Eu tive um cenário ligeiramente diferente:

    • um não-repo ( passar por um tarball do github )
    • a necessidade de restaurar um repo completo desse conteúdo.

    Solução:

    • clonar um repository vazio nesse conteúdo, em um diretório .git :
      git clone --bare https://github.com/user/project .git
    • Marque como um repository não-nu:
      git config --local --bool core.bare false
    • redefinir o índice (caso contrário, ele acredita que tudo foi excluído, já que um .git não inclui um arquivo ‘ index ‘).
      git reset HEAD -- .
      Isso restaura o .git/index .

    Eu efetivamente transformei um repository nu em um não-nu, enquanto preservava o conteúdo que eu tinha anteriormente.
    O roteiro completo que venho usando há anos envolve as etapas:

     cd /path/to/current/worktree # That creates a .git directly at the right place git clone --bare /url/of/repo .git # restore the link between the local repo and its upstream remote repo git config --local --bool core.bare false git config --local remote.origin.fetch +refs/heads/*:refs/remotes/origin/* git fetch origin git branch -u origin/master master # reset the index (not the working tree) git reset HEAD -- . 

    Mas reconto a solução aceita (com a etapa útil de git reset adicionada pelo ADTC ) é mais simples.

    Para simplificar e combinar as informações nas respostas:

    Existem duas diferenças que tornam um repository simples diferente de uma pasta normal .git:

    • core.bare é definido como true no arquivo de configuração
    • arquivo de índice e tree de trabalho não existem

    Então, você pode simplesmente mover seu repository nu para ser a subpasta .git de uma nova pasta,

     mkdir clone mv bare.git clone/.git 

    Mude o core.bare:

     cd clone git config --local --bool core.bare false 

    E gere o arquivo de índice e a tree de trabalho:

     git checkout master 

    Eu recomendo git checkout ao invés de git reset para gerar os arquivos, caso eles sejam acidentalmente typescripts no lugar errado.

    Se você estiver com pouco espaço em disco, expandir a tree de trabalho convertendo para um repository normal será um problema, mas poderá procurar o conteúdo de um repository sem convertê-lo. Use git cat-file -p em qualquer commit para ver a tree a que se refere. Use git cat-file -p para ver o conteúdo do arquivo referenciado pelo blob. Use git show :path onde sha é uma confirmação ou uma tree para ver o conteúdo do blob no caminho.

    A pergunta do pôster original é sobre não ter espaço suficiente para fazer as coisas da maneira mais simples. Para aqueles que têm espaço suficiente, a resposta é muito mais simples:

     git clone foo.git foo 

    Se você não se importa de trabalhar em diferentes worktree, então

     git worktree add ../repo2 cd .. git status # now works fine 

    Por favor, note que este não é um clone.

    cd em repo nua e fazer

    git config core.bare false

    git reset --hard

    ou

    git clone X.git X (lhe dará um git clone X.git X git regular chamado X)