Qual è la differenza tra “git init” e “git init –bare”?

Qual è la differenza tra git init e git init --bare ? Ho scoperto che un sacco di post sul blog richiede --bare per il loro server Git?

Dalla pagina man , diceva:

 --bare 

Crea un repository nudo. Se l’ambiente GIT_DIR non è impostato, viene impostato sulla directory di lavoro corrente

Ma cosa significa in realtà? È necessario avere --bare per l’installazione del server Git?

Git Repo non Bare

Questa variante crea un repository con una directory di lavoro in modo che tu possa effettivamente lavorare ( git clone ). Dopo averlo creato, vedrai che la directory contiene una cartella .git in cui va la cronologia e tutti i git plumbing. Lavorate al livello in cui si trova la cartella .git.

Bare Git Repo

L’altra variante crea un repository senza una directory di lavoro ( git clone --bare ). Non hai una directory in cui puoi lavorare. Tutto nella directory è ora ciò che era contenuto nel caso precedente.

Perché useresti l’uno contro l’altro

La necessità di repository git senza una directory di lavoro è il fatto che è ansible spingere i rami su di esso e non gestisce ciò su cui qualcuno sta lavorando. Puoi ancora inviare push a un repository che non è nullo, ma ti verrà rifiutato perché puoi potenzialmente spostare un ramo su cui qualcuno sta lavorando in quella directory di lavoro.

Quindi in un progetto senza cartella funzionante, puoi vedere solo gli oggetti come git li memorizza. Sono compressi e serializzati e memorizzati sotto SHA1 (un hash) dei loro contenuti. Per ottenere un object in un repository nudo, è necessario git show e quindi specificare lo sha1 dell’object che si desidera vedere. Non vedrai una struttura come il tuo progetto.

I repository nudi sono in genere repository centrali in cui ognuno sposta il proprio lavoro. Non c’è bisogno di manipolare il lavoro reale. È un modo per sincronizzare gli sforzi tra più persone. Non sarai in grado di vedere direttamente i tuoi file di progetto.

Potresti non aver bisogno di repository nudi se sei l’unico che lavora al progetto o non vuoi / hai bisogno di un repository “logicamente centrale”. Uno preferirebbe git pull dagli altri repository in quel caso. Questo evita le obiezioni che ha git quando spinge verso repository non nudi.

Spero che questo ti aiuti

Risposta breve

Un repository nudo è un repository git senza una copia funzionante, quindi il contenuto di .git è di primo livello per quella directory.

Utilizzare un repository non nudo per lavorare localmente e un repository nudo come server / hub centrale per condividere le modifiche con altre persone. Ad esempio, quando si crea un repository su github.com, viene creato come un repository nudo.

Quindi, nel tuo computer:

 git init touch README git add README git commit -m "initial commit" 

sul server:

 cd /srv/git/project git init --bare 

Quindi sul client, si preme:

 git push [email protected]:/srv/git/project master 

È quindi ansible salvare se stessi digitando aggiungendolo come remoto.

Il repository sul lato server sta per ottenere i commit tramite pull e push, e non con la modifica dei file e il loro commit nella macchina server, quindi si tratta di un repository spoglio.

Dettagli

È ansible passare a un repository che non è un repository nullo, e git scoprirà che esiste un repository .git lì, ma poiché la maggior parte degli archivi “hub” non ha bisogno di una copia funzionante, è normale utilizzare un repository spoglio per e raccomandato in quanto non ha senso avere una copia funzionante in questo tipo di repository.

Tuttavia, se si esegue il push su un repository non nullo, si sta rendendo incoerente la copia di lavoro e git ti avviserà:

 remote: error: refusing to update checked out branch: refs/heads/master remote: error: By default, updating the current branch in a non-bare repository remote: error: is denied, because it will make the index and work tree inconsistent remote: error: with what you pushed, and will require 'git reset --hard' to match remote: error: the work tree to HEAD. remote: error: remote: error: You can set 'receive.denyCurrentBranch' configuration variable to remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into remote: error: its current branch; however, this is not recommended unless you remote: error: arranged to update its work tree to match what you pushed in some remote: error: other way. remote: error: remote: error: To squelch this message and still keep the default behaviour, set remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'. 

È ansible saltare questo avviso. Ma l’impostazione consigliata è: utilizzare un repository non nullo per lavorare localmente e un repository spoglio come hub o server centrale da cui estrarre e spostare.

Se si desidera condividere il lavoro direttamente con la copia di lavoro di altri sviluppatori, è ansible estrarre gli uni dagli altri repository invece di premere.

Quando ho letto questa domanda qualche tempo fa, tutto mi confondeva. Ho appena iniziato a usare git e ci sono queste copie funzionanti (il che significava niente in quel momento). Cercherò di spiegarlo dal punto di vista del ragazzo, che ha appena iniziato a chiacchierare senza avere idea della terminologia.

Un buon esempio delle differenze può essere descritto nel modo seguente :

--bare ti dà solo un deposito (non puoi svilupparti lì). Senza --bare ti dà la possibilità di svilupparti lì (e avere un posto dove riporre).

git init crea un repository git dalla tua directory corrente. Aggiunge la cartella .git al suo interno e rende ansible iniziare la cronologia delle revisioni.

git init --bare crea anche un repository, ma non ha la directory di lavoro. Ciò significa che non è ansible modificare file, salvare le modifiche, aggiungere nuovi file in quel repository.

Quando --bare può essere utile? Tu e pochi altri ragazzi stanno lavorando al progetto e usate git. Hai ospitato il progetto su alcuni server ( amazon ec2 ). Ognuno di voi ha la propria macchina e si spinge il codice su ec2 . Nessuno di voi in realtà sviluppa nulla su ec2 (tu usi le tue macchine) – ti basta inserire il tuo codice. Quindi ec2 è solo uno storage per tutto il tuo codice e dovrebbe essere creato come --bare e tutte le tue macchine senza --bare (probabilmente solo una, e l’altra semplicemente clonerà tutto). Il stream di lavoro è simile a questo:

inserisci la descrizione dell'immagine qui

Un repository Git predefinito presuppone che lo si utilizzi come directory di lavoro. In genere, quando si è su un server, non è necessario disporre di una directory di lavoro. Solo il repository. In questo caso, dovresti usare l’opzione --bare .

Un repository non nudo è l’impostazione predefinita. È ciò che viene creato quando si esegue git init , o ciò che si ottiene quando si clona (senza l’opzione bare ) da un server.

Quando lavori con un repository come questo, puoi vedere e modificare tutti i file presenti nel repository. Quando si interagisce con il repository, ad esempio mediante il commit di una modifica, Git memorizza le modifiche in una directory nascosta denominata .git .

Quando si ha un server Git non è necessario che ci siano copie funzionanti dei file. Tutto ciò di cui hai bisogno sono i dati Git che sono archiviati in .git . Un repository nudo è esattamente la directory .git , senza un’area di lavoro per la modifica e il commit dei file.

Quando cloni da un server Git ha tutte le informazioni necessarie nella directory .git per creare la tua copia di lavoro.