Come si usa il repository "git --bare init"?


321

Devo creare un repository Git centrale ma sono un po 'confuso ...

Ho creato un repository nudo (nel mio server git, macchina 2) con:

$ mkdir test_repo
$ git --bare init

Ora devo trasferire i file dal mio repository locale (macchina 1) al repository nudo (macchina 2). Ho accesso alla macchina 2 tramite SSH. Il fatto è che penso di non capire il concetto di un repository nudo ...

Qual è il modo giusto di archiviare il mio codice nel repository nudo? Come posso trasferire le modifiche dal mio repository locale al repository nudo?

È il modo giusto di avere un repository centrale per avere un repository nudo?

Sono un po 'confuso con questo argomento. Per favore, dammi un indizio su questo.

Risposte:


392

In primo luogo, solo per verificare, è necessario passare alla directory creata prima di eseguire git init --bare. Inoltre, è convenzionale fornire l'estensione nuda ai repository .git. Quindi puoi farlo

git init --bare test_repo.git

Per le versioni Git <1.8 lo faresti

mkdir test_repo.git
cd test_repo.git
git --bare init

Per rispondere alle tue domande successive, i repository nudi (per definizione) non hanno un albero di lavoro collegato a loro, quindi non puoi aggiungere facilmente i file come faresti in un normale repository non nudo (ad es. Con git add <file>e successivi git commit. )

Quasi sempre aggiorni un repository nudo spingendolo (usando git push) da un altro repository.

Tieni presente che in questo caso dovrai prima consentire alle persone di inviare al tuo repository. Quando dentro test_repo.git, fallo

git config receive.denyCurrentBranch ignore

Modifica della comunità

git init --bare --shared=group

Come commentato da prasanthv, questo è quello che vuoi se lo fai sul lavoro, piuttosto che per un progetto di casa privata.


7
È inoltre possibile aggiungere l' --sharedopzione per initse si prevede di fare in modo che altre persone spingano in questo repository. Aggiunge automaticamente le autorizzazioni di scrittura di gruppo al repository - link
prasanthv

17
Penso che queste tre righe abbiano lo stesso effetto di questa unica: git --bare init test_repo.git Almeno con la mia attuale versione di git (1.8.2.2)
Fran Marzoa,

1
utile se si desidera conoscere differenza tra repos nudi e non-nude stackoverflow.com/questions/7861184/...
Guille Acosta

come fa git a trovare roba se non c'è un albero funzionante? pensavo che ci fosse un albero di lavoro nel negozio di oggetti git, ed è quello che indicano gli SHA di messa in scena e gli impegni
akantoword

@akantoword: git memorizza tutte le informazioni su commit e filiali da qualche parte. Un commit è probabilmente principalmente un diff tra la versione precedente dei file e la nuova versione. L'albero di lavoro è solo un'istantanea del suo contenuto reale in un momento specifico. Ad ogni modo, con un albero funzionante puoi andare avanti e indietro tra commit e rami. Puoi anche fare il checkout su un altro albero di lavoro, se lo desideri.
user276648

246

Sto aggiungendo questa risposta perché dopo essere arrivati ​​qui (con la stessa domanda), nessuna delle risposte descrive in realtà tutti i passaggi necessari per passare dal nulla a un repository remoto (semplice) completamente utilizzabile.

Nota: questo esempio usa percorsi locali per l'ubicazione del repository nudo, ma altri protocolli git (come SSH indicato dall'OP) dovrebbero funzionare bene.

Ho provato ad aggiungere alcune note lungo la strada per coloro che hanno meno familiarità con Git.

1. Inizializza il repository nudo ...

> git init --bare /path/to/bare/repo.git
Initialised empty Git repository in /path/to/bare/repo.git/

Questo crea una cartella (repo.git) e la popola con file git che rappresentano un repository git. Allo stato attuale, questo repository è inutile: non ha impegni e, soprattutto, non ha filiali . Sebbene sia possibile clonare questo repository, non è possibile estrarlo.

Successivamente, dobbiamo creare una cartella di lavoro. Ci sono un paio di modi per farlo, a seconda che tu abbia file esistenti.

2a. Creare una nuova cartella di lavoro (nessun file esistente) clonando il repository vuoto

git clone /path/to/bare/repo.git /path/to/work
Cloning into '/path/to/work'...
warning: You appear to have cloned an empty repository.
done.

Questo comando funzionerà solo se /path/to/worknon esiste o è una cartella vuota. Prendi nota dell'avvertimento: in questa fase non hai ancora nulla di utile. Se cd /path/to/workcorri e git statusotterrai qualcosa come:

On branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)

ma questa è una bugia. Non sei davvero sul ramo master(perché git branchnon restituisce nulla) e finora non ci sono commit.

Quindi, copia / sposta / crea alcuni file nella cartella di lavoro, aggiungili a git e crea il primo commit.

> cd /path/to/work
> echo 123 > afile.txt
> git add .
> git config --local user.name adelphus
> git config --local user.email adelphus@example.com
> git commit -m "added afile"
[master (root-commit) 614ab02] added afile
 1 file changed, 1 insertion(+)
 create mode 100644 afile.txt

I git configcomandi sono necessari solo se non hai già detto a git chi sei. Nota che se ora esegui git branch, ora vedrai il masterramo elencato. Ora esegui git status:

On branch master
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

nothing to commit, working directory clean

Anche questo è fuorviante: l'upstream non è "andato", semplicemente non è stato ancora creato e git branch --unset-upstreamnon aiuterà. Ma va bene, ora che abbiamo il nostro primo commit, possiamo spingere e il master verrà creato sul repository nudo.

> git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 207 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /path/to/bare/repo.git
 * [new branch]      master -> master

A questo punto, abbiamo un repository nudo completamente funzionale che può essere clonato altrove su un ramo master, nonché una copia di lavoro locale che può essere estratta e spinta.

> git pull
Already up-to-date.
> git push origin master
Everything up-to-date

2b. Creare una cartella di lavoro da file esistenti Se si dispone già di una cartella con file (quindi non è possibile clonare in essa), è possibile inizializzare un nuovo repository git, aggiungere un primo commit e collegarlo successivamente al repository nudo.

> cd /path/to/work_with_stuff
> git init 
Initialised empty Git repository in /path/to/work_with_stuff
> git add .
# add git config stuff if needed
> git commit -m "added stuff"

[master (root-commit) 614ab02] added stuff
 20 files changed, 1431 insertions(+)
 create mode 100644 stuff.txt
...

A questo punto abbiamo il nostro primo commit e un ramo master locale che dobbiamo trasformare in un ramo upstream con tracciamento remoto.

> git remote add origin /path/to/bare/repo.git
> git push -u origin master
Counting objects: 31, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (31/31), done.
Writing objects: 100% (31/31), 43.23 KiB | 0 bytes/s, done.
Total 31 (delta 11), reused 0 (delta 0)
To /path/to/bare/repo.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

Nota il -uflag su git push per impostare il (nuovo) ramo tracciato a monte. Proprio come prima, ora abbiamo un repository nudo completamente funzionale che può essere clonato altrove su un ramo master, nonché una copia di lavoro locale che può estrarre e spingere.

Tutto questo può sembrare ovvio per alcuni, ma git mi confonde il più delle volte (è un messaggio di errore e di stato che ha davvero bisogno di essere rielaborato) - si spera, questo aiuterà gli altri.


4
Interessante. Certamente più dettagliato della mia risposta. +1
VonC,

13
Questa risposta risolve il mio problema e dovrebbe essere la risposta accettata, spero che sempre più persone possano votarlo.
inix

11
Dovresti addebitare denaro per risposte come questa
Arthur Tarasov il

2
Come nuovo utente git, questa risposta mi è stata incredibilmente utile, grazie per averlo scritto!
sidewinderguy,

1
Questa è una risposta brillante. Aiuterà molto la nostra unità.
Wobsoriano,

33

Rispondere alle domande una ad una:

Il repository nudo è quello che non ha alberi funzionanti . Significa che il suo intero contenuto è quello che hai nella .gitdirectory.

Puoi solo commitscoprire il repository pushinserendolo dal tuo clone locale. Non ha alberi funzionanti, quindi non ha file modificati, né modifiche.

Per avere un repository centrale l'unico modo è avere un barerepository.


22

Puoi anche chiedere a git di creare la directory per te:

git init --bare test_repo.git

20

La pratica generale è avere il repository centrale a cui si spinge come repository nudo.

Se si dispone di background SVN, è possibile correlare un repository SVN a un repository bare Git. Non ha i file nel repository nella forma originale. Considerando che il tuo repository locale avrà anche i file che formano il tuo "codice".

È necessario aggiungere un telecomando al repository nudo dal repository locale e inviare il "codice" ad esso.

Sarà qualcosa del tipo:

git remote add central <url> # url will be ssh based for you
git push --all central

Usando git remote add central <url>, nel caso di SSH questo includerebbe anche il percorso? ad es.git remote add central ssh://user@server/home/user/repo.git
Sì, Barry,

17

Questo dovrebbe essere sufficiente:

git remote add origin <url-of-bare-repo>
git push --all origin

Per ulteriori dettagli, vedere " GIT: come aggiorno il mio repository nudo? ".
Appunti:

  • è possibile utilizzare un nome diverso da " origin" per il riferimento remoto del repository nudo.
  • questo non spingerà i tuoi tag, ne hai bisogno per uno separato git push --tags origin.

5

È bello verificare che il codice che hai inviato sia stato effettivamente impegnato.

È possibile ottenere un registro delle modifiche su un repository nudo impostando esplicitamente il percorso utilizzando l'opzione --relative.

$ cd test_repo
$ git log --relative=/

Questo ti mostrerà le modifiche impegnate come se si trattasse di un normale repository git.


5

Basato sulle risposte di Mark Longair e Roboprog:

se versione git> = 1.8

git init --bare --shared=group .git
git config receive.denyCurrentBranch ignore

O :

se versione git <1.8

mkdir .git
cd .git
git init --bare --shared=group 
git config receive.denyCurrentBranch ignore

Quel comando di configurazione: come finisce per applicarsi alla directory .git che hai appena creato?
GreenAsJade,

Non sono sicuro di aver capito la tua domanda? Puoi essere più preciso? Dato che il tuo repository git è stato inizializzato, puoi configurarlo quanto vuoi con il comando 'git config' ..
Jack

@GreenAsJade È perché sei ancora nella cartella del repository git, quindi si applica a quello (il default della configurazione git è come l'opzione --local).
BlueCoder

2

Il flag --bare crea un repository che non ha una directory di lavoro. Il repository nudo è il repository centrale e qui non è possibile modificare (archiviare) i codici per evitare l'errore di fusione.

Ad esempio, quando si aggiunge un file nel repository locale (macchina 1) e lo si spinge nel repository nudo, non è possibile vedere il file nel repository nudo poiché è sempre "vuoto". Tuttavia, si spinge davvero qualcosa nel repository e lo si può vedere in modo esplicito clonando un altro repository nel proprio server (macchina 2).

Sia il repository locale nella macchina 1 che il repository 'copia' nella macchina 2 non sono nudi. relazione tra repository nudo e non nudo

Il blog ti aiuterà a capirlo. https://www.atlassian.com/git/tutorials/setting-up-a-repository


0

È possibile eseguire i seguenti comandi per inizializzare il repository locale

mkdir newProject
cd newProject
touch .gitignore
git init
git add .
git commit -m "Initial Commit"
git remote add origin user@host:~/path_on_server/newProject.git
git push origin master

Dovresti lavorare sul tuo progetto dal tuo repository locale e usare il server come repository centrale.

Puoi anche seguire questo articolo che spiega ogni singolo aspetto della creazione e manutenzione di un repository Git. Git per principianti

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.