Come convertire un normale repository Git in uno nudo?

Come posso convertire un repository Git ‘normale’ in uno solo?

La principale differenza sembra essere:

  • nel normale repository git hai una cartella .git all’interno del repository contenente tutti i dati rilevanti e tutti gli altri file creano la tua copia di lavoro

  • in un repository Git spoglio, non esiste una copia funzionante e la cartella (chiamiamola repo.git ) contiene i dati del repository effettivo

In breve: sostituisci il contenuto del repo con il contenuto di repo/.git , quindi comunica al repository che ora è un repository nullo.

Per fare ciò, eseguire i seguenti comandi:

 cd repo mv .git ../repo.git # renaming just for clarity cd .. rm -fr repo cd repo.git git config --bool core.bare true 

Nota che questo è diverso dal fare un git clone --bare in una nuova posizione (vedi sotto).

Il tuo metodo sembra funzionerebbe; la struttura del file di un repository nudo è solo ciò che si trova nella directory .git. Ma non so se qualcuno dei file sia effettivamente cambiato, quindi se fallisce, puoi farlo

 git clone --bare /path/to/repo 

Probabilmente avrai bisogno di farlo in una directory diversa per evitare un conflitto di nomi, e quindi potrai semplicemente spostarlo di nuovo nel punto desiderato. E potrebbe essere necessario modificare il file di configurazione in modo che punti ovunque sia il repository di origine.

Penso che il seguente link sarebbe utile

GitFaq: Come posso rendere nullo il repository non nudo esistente?

 $ mv repo/.git repo.git $ git --git-dir=repo.git config core.bare true $ rm -rf repo 

A meno che tu non voglia o non sia necessario modificare i bit sul filesystem, è davvero semplice creare una versione nuda di un repository non nullo (menzionato in molti altri post qui). Fa parte delle funzionalità principali di git:

git clone --bare reponame bare_reponame

Volevo solo passare a un repository su un percorso di rete, ma git non me lo permetteva di farlo, a meno che quel repository non fosse contrassegnato come nuda. Tutto ciò di cui avevo bisogno era di cambiare la sua configurazione:

 git config --bool core.bare true 

Non c’è bisogno di giocherellare con i file a meno che tu non voglia tenerlo pulito.

Si prega inoltre di prendere in considerazione l’utilizzo

 git clone --mirror path_to_source_repository 

Dalla documentazione :

Configurare un mirror del repository di origine. Questo implica – minimo. Rispetto a –bare, –mirror non solo esegue il mapping dei rami locali della sorgente ai rami locali del target, ma mappa tutti i riferimenti (inclusi rami di tracciamento remoto, note, ecc.) E imposta una configurazione refspec in modo tale che tutti questi riferimenti vengono sovrascritti da un aggiornamento remoto git nel repository di destinazione.

ho letto le risposte e ho fatto questo:

 cd repos mv .git repos.git cd repos.git git config --bool core.bare true # from another answer cd ../ mv repos.git ../ cd ../ rm -rf repos/ # or delete using a file manager if you like 

questo lascerà il contenuto di repos/.git come bare repos.git

Ecco cosa penso sia più sicuro e più semplice. Non c’è niente qui non dichiarato sopra. Voglio solo vedere una risposta che mostra una procedura passo-passo sicura. Si avvia una cartella dal repository (repository) che si desidera rendere nuda. Ho adottato la convenzione implicita sopra che le cartelle di repository nude hanno un’estensione .git.

 (1) Backup, just in case. (a) > mkdir backup (b) > cd backup (c) > git clone ../repo (2) Make it bare, then move it (a) > cd ../repo (b) > git config --bool core.bare true (c) > mv .git ../repo.git (3) Confirm the bare repository works (optional, since we have a backup) (a) > cd .. (b) > mkdir test (c) > cd test (d) > git clone ../repo.git (4) Clean up (a) > rm -Rf repo (b) (optional) > rm -Rf backup/repo (c) (optional) > rm -Rf test/repo 

Basta leggere

Pro Git Book: 4.2 Git sul server – Ottenere Git su un server

che si riducono a

 $ git clone --bare my_project my_project.git Cloning into bare repository 'my_project.git'... done. 

Quindi metti my_project.git sul server

Il che è principalmente, che la risposta # 42 ha cercato di sottolineare. Shurely si potrebbe reinventare la ruota 😉

Ecco una piccola funzione BASH che puoi aggiungere al tuo .bashrc o .profile su un sistema basato su UNIX. Una volta aggiunto, la shell viene riavviata o il file viene ricaricato tramite una chiamata a source ~/.profile o source ~/.bashrc .

 function gitToBare() { if [ -d ".git" ]; then DIR="`pwd`" mv .git .. rm -fr * mv ../.git . mv .git/* . rmdir .git git config --bool core.bare true cd .. mv "${DIR}" "${DIR}.git" printf "[\x1b[32mSUCCESS\x1b[0m] Git repository converted to " printf "bare and renamed to\n ${DIR}.git\n" cd "${DIR}.git" else printf "[\x1b[31mFAILURE\x1b[0m] Cannot find a .git directory\n" fi } 

Una volta chiamato all’interno di una directory contenente una directory .git, eseguirà le modifiche appropriate per convertire il repository. Se non è presente una directory .git quando viene chiamato, verrà visualizzato un messaggio di FAILURE e non si verificheranno modifiche al file system.

I metodi che dicono di rimuovere i file e di spostare la directory .git non sono puliti e non usano il metodo “git” per fare qualcosa che dovrebbe essere semplice. Questo è il metodo più pulito che ho trovato per convertire un normale repository in un repository nudo.

Primo clone / percorso / a / normale / repo in un repository chiamato repo.git

 git clone --bare /path/to/normal/repo 

Successivamente rimuovere l’origine che punta a / percorso / a / normale / repo

 cd repo.git git remote rm origin 

Finalmente puoi rimuovere il tuo repository originale. Potresti rinominare repo.git in repo a quel punto, ma la convenzione standard per significare un repository git è qualcosa. Per esempio, lo lascio personalmente in quel modo.

Una volta che hai fatto tutto questo, puoi clonare il tuo nuovo repository (che in effetti crea un normale repository, ed è anche il modo in cui lo convertirai da nudo in normale)

Ovviamente, se hai altri flussi, vorresti prenderne nota e aggiornare il tuo repository per includerlo. Ma ancora, tutto può essere fatto con il comando git. Ricorda che le pagine man sono tuoi amici.

Nel caso in cui si disponga di un repository con poche filiali / refs / heads / * di controllo remoto e pochi rami remoti filiali / origine / * E se si desidera convertirlo in un repository BARE con tutti i rami in / refs / heads / *

puoi fare quanto segue per salvare la cronologia.

  1. creare un repository nudo
  2. cd nel repository locale che ha filiali di checkout locali e filiali remote
  3. git push / path / to / bare / repo + refs / remotes / origin / : refs / heads /

Ho usato il seguente script per leggere un file di testo che ha una lista di tutti i miei repository SVN e convertirli in GIT, e successivamente usare git clone –bare per convertirli in un repository git nudo

 #!/bin/bash file="list.txt" while IFS= read -r repo_name do printf '%s\n' "$repo_name" sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name sudo git clone --bare /programs/git/$repo_name $repo_name.git sudo chown -R www-data:www-data $repo_name.git sudo rm -rf $repo_name done < "$file" 

list.txt ha il formato

 repo1_name repo2_name 

e users.txt ha il formato

(no author) = Prince Rogers

www-data è l'utente del server Web Apache, è necessario il permesso per trasferire le modifiche su HTTP

Innanzitutto, backup tuo repository esistente:

 (a) mkdir backup (b) cd backup (c) git clone non_bare_repo 

In secondo luogo, eseguire quanto segue:

 git clone --bare -l non_bare_repo new_bare_repo 

Oneliner per eseguire tutte le operazioni sopra elencate:

 for i in `ls -A .`; do if [ $i != ".git" ]; then rm -rf $i; fi; done; mv .git/* .; rm -rf .git; git config --bool core.bare true 

(non dare la colpa a me se qualcosa esplode e non hai avuto backup: P)

Wow, è semplicemente incredibile il modo in cui molte persone si sono espresse in questo, specialmente considerando che non sembra che non si sia mai fermato a chiedere perché questa persona sta facendo quello che sta facendo.

L’unica differenza tra un repository git nudo e non nudo è che la versione non nuda ha una copia funzionante. Il motivo principale per cui hai bisogno di un repository completo è se volessi renderlo disponibile a una terza parte, non puoi lavorare direttamente su di esso in modo tale che a un certo punto dovrai clonarlo e a che punto sei torna a una normale versione di copia di lavoro.

Detto questo, per convertire in un semplice repository tutto quello che devi fare è assicurarti di non avere nessun commit in sospeso e poi solo:

 rm -R * && mv .git/* . && rm -R .git 

Ci andiamo, bare repo.