Come posso convertire un repository git nudo in uno normale (sul posto)?

Ho un repository git spoglio, ma ho bisogno di accedere e navigare i suoi contenuti su ssh (in un gestore di file come l’esperienza utente).

Suppongo di poterlo clonare:

git clone -l   

Tuttavia, il mio repository ha una dimensione di circa 20 GB e non ho lo spazio per duplicarlo. C’è un modo per convertire il repository nudo sul posto per finire con una copia di lavoro al suo interno?

    Nota : l’ho provato su un repository 1-commit molto semplice . Ricontrolla, leggi le pagine man e sii sempre felice di aver eseguito il backup prima di seguire i consigli che hai trovato su StackOverflow. (Fai il backup, vero?)

    Per convertire un repository --bare in un non-bare:

    1. Crea una cartella .git nel livello principale del tuo repository.
    2. Sposta le cose di gestione del repository (la HEAD branches config description hooks info objects refs ecc.) Nel file .git appena creato.
    3. Esegui git config --local --bool core.bare false per convertire il repository git locale in non-bare.
    4. (tramite il commento di Tamás Pap ) Dopo il punto 3 vedrete che siete su un master ramo (o qualunque sia il vostro ramo principale) e tutti i vostri file vengono cancellati e la cancellazione è in corso. È normale. È sufficiente eseguire manualmente il checkout master o eseguire un git reset --hard e il gioco è fatto.

    Questi passaggi sono nella direzione opposta di questa domanda , “git-convert normale al repository nudo” – in particolare, si noti questa risposta , che afferma che i passaggi precedenti (in, presumo, in entrambe le direzioni) sono diversi dal fare un git-clone . Non sono sicuro che sia rilevante per te, ma hai menzionato il git clone nella domanda.

    Ho avuto uno scenario leggermente diverso:

    • un non-repo ( passare attraverso un tarball da github )
    • la necessità di ripristinare un repo completo da quel contenuto.

    Soluzione:

    • clonare un repository nudo in quel contenuto, in una .git :
      git clone --bare https://github.com/user/project .git
    • Contrassegnalo come un repository non nudo:
      git config --local --bool core.bare false
    • resettare l’indice (altrimenti, ritiene che tutto sia stato cancellato, dal momento che un repository .git bare non include un file ‘ index ‘.)
      git reset HEAD -- .
      Che ripristina il .git/index .

    Ho trasformato in modo efficace un repository nudo in uno non nudo, preservando il contenuto che avevo precedentemente ottenuto.
    La sceneggiatura completa che uso da anni comporta i passaggi:

     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 -- . 

    Ma riconsiderare la soluzione accettata (con l’ utile step di git reset aggiunto da ADTC ) è più semplice.

    Per semplificare e combinare le informazioni nelle risposte:

    Ci sono due differenze che rendono un repository diverso da una normale cartella .git:

    • core.bare è impostato su true nel file di configurazione
    • il file di indice e l’albero di lavoro non esistono

    Quindi, puoi semplicemente spostare il tuo repository nudo in una sottocartella .git di una nuova cartella,

     mkdir clone mv bare.git clone/.git 

    Cambia core.bare:

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

    E generi il file indice e l’albero di lavoro:

     git checkout master 

    Raccomando git checkout piuttosto che git reset per generare i file, nel caso in cui venga digitato accidentalmente nel posto sbagliato.

    Se il livello di spazio su disco è basso, l’espansione dell’albero di lavoro mediante la conversione in un repository normale costituirà un problema, ma è ansible sfogliare il contenuto di un repository nudo senza convertirlo. Usa git cat-file -p su qualsiasi commit per vedere l’albero a cui si riferisce. Usa git cat-file -p per vedere il contenuto del file a cui fa riferimento il blob. Usa git show :path cui sha è o un commit o un albero per vedere il contenuto del blob sul percorso.

    La domanda del poster originale è di non avere abbastanza spazio per fare le cose nel modo più semplice. Per quelli che hanno abbastanza spazio, la risposta è molto più semplice:

     git clone foo.git foo 

    Se non ti dispiace lavorare su diversi worktree, allora

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

    Si prega di notare, questo non è un clone.

    cd nel repository nudo e fare

    git config core.bare false

    git reset --hard

    o

    git clone X.git X (ti darà un normale repo git che ha il nome X)