Jaka jest-praktyczna-różnica między gołym i nie gołym repozytorium?

Czytałem o nagich i nie-nagich / domyślnych repozytoriach w Git. Nie byłem w stanie dobrze zrozumieć (teoretycznie) różnic między nimi i dlaczego powinienem "wcisnąć" do gołego repozytorium. Oto umowa:

Obecnie jestem jedynym, który pracuje nad projektem na 3 różnych komputerach, ale później będzie więcej osób zaangażowanych w ten projekt, więc używam Gita do kontroli wersji. Klonuję gołe repo na wszystkich komputerach, a kiedy skończę moje modyfikacje na jednym z nich, zatwierdzam i pcham zmiany do gołego repo. Z tego, co czytałem, gołe repozytorium nie ma "działającego drzewa", więc jeśli sklonuję gołe repozytorium, Nie będę miał "działającego drzewa".

Domyślam się, że działające drzewo przechowuje informacje o zatwierdzeniu, gałęziach itp. z projektu. To nie pojawiłoby się w nagiej repo. Wydaje mi się więc lepiej "wcisnąć" commity do repo za pomocą działającego drzewa.

W takim razie, Dlaczego mam używać gołego repozytorium a dlaczego nie? Jaka jest praktyczna różnica? to nie byłoby korzystne dla większej liczby osób pracujących nad projektem, jak sądzę.

Jakie są Twoje metody do tego rodzaju pracy? Sugestie?

Author: CharlesB, 2011-04-04

11 answers

Repozytorium nie posiada domyślnego repozytorium zdalnegoorigin :

~/Projects$ git clone --bare test bare
Initialized empty Git repository in /home/derek/Projects/bare/
~/Projects$ cd bare
~/Projects/bare$ git branch -a
* master
~/Projects/bare$ cd ..
~/Projects$ git clone test non-bare
Initialized empty Git repository in /home/derek/Projects/non-bare/.git/
~/Projects$ cd non-bare
~/Projects/non-bare$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

Ze strony podręcznika dla git clone --bare:

/ Align = "left" / są kopiowane bezpośrednio do odpowiednich szefowie oddziałów lokalnych, bez mapowania je do refs / piloty / pochodzenie/. Kiedy ta opcja jest używana, ani odgałęzienia zdalnego śledzenia ani powiązane zmienne konfiguracyjne to stworzony.

Przypuszczalnie, kiedy tworzy repozytorium, Git zakłada, że repozytorium będzie służyć jako repozytorium origin dla kilku zdalnych użytkowników, więc nie tworzy domyślnego repozytorium Origin. Oznacza to, że podstawowe operacje git pull i git push nie będą działać, ponieważ Git zakłada, że bez obszaru roboczego nie zamierzasz wprowadzać żadnych zmian do repozytorium:

~/Projects/bare$ git push
fatal: No destination configured to push to.
~/Projects/bare$ git pull
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.
~/Projects/bare$ 
 102
Author: Derek Mahar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-24 12:53:48

5 lat za późno, wiem, ale nikt nie odpowiedział na pytanie:

W takim razie, dlaczego powinienem używać gołego repozytorium, a dlaczego nie? What ' s the praktyczna różnica? To nie byłoby korzystne dla większej liczby ludzi pracuję nad projektem.

Jakie są Twoje metody do tego rodzaju pracy? Sugestie?

[[4]} cytuję bezpośrednio z książki Loeligera / Mcullougha (978-1-449-31638-9, p196/7):

Nagie repozytorium może wydawać się z niewielkie zastosowanie, ale jego rola jest kluczowe: służyć jako autorytatywny punkt centralny dla współpracy rozwój. Inni deweloperzy clone i fetch z gołego repozytorium i push aktualizacje do niego... jeśli skonfigurujesz repozytorium w które deweloperzy push zmienia, powinno być gołe. W efekcie jest to szczególny przypadek bardziej ogólnej najlepszej praktyki, że opublikowane repozytorium powinno być nagie.

 70
Author: EML,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-28 10:01:34

Rozróżnienie pomiędzy gołym i nie-gołym repozytorium Git jest sztuczne i wprowadza w błąd, ponieważ przestrzeń robocza nie jest częścią repozytorium i nie wymaga przestrzeni roboczej. Ściśle mówiąc, repozytorium Git zawiera obiekty opisujące stan repozytorium. Obiekty te mogą istnieć w dowolnym katalogu, ale zazwyczaj istnieją w katalogu .git w katalogu najwyższego poziomu obszaru roboczego. Obszar roboczy jest drzewem katalogów, które reprezentuje określony commit w repozytorium, ale może istnieć w dowolnym katalogu lub wcale. Zmienna środowiskowa $GIT_DIR łączy obszar roboczy z repozytorium, z którego pochodzi.

Polecenia Git git clone oraz git init oba mają Opcje --bare, które tworzą repozytoria bez początkowego obszaru roboczego. Szkoda, że Git łączy dwa oddzielne, ale powiązane pojęcia przestrzeni roboczej i repozytorium, a następnie używa mylącego terminu bare, aby oddzielić te dwie idee.

 67
Author: Derek Mahar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-05 13:18:46

Nagie repozytorium to nic innego jak .sam folder git , tzn. zawartość nagiego repozytorium jest taka sama jak zawartość .Git folder wewnątrz lokalnego repozytorium.

  • Użyj gołego repozytorium na zdalnym serwerze, aby umożliwić wielu współpracownikom push ich pracę.
  • Non-bare - ten, który ma działające drzewo ma sens na lokalnej maszynie każdego współpracownika twojego projektu.
 64
Author: Deepak Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-10 09:58:27

Nie-nagie repozytorium ma po prostu sprawdzone działające drzewo. Drzewo robocze nie przechowuje żadnych informacji o stanie repozytorium (gałęzie, znaczniki itp.); raczej drzewo robocze jest tylko reprezentacją rzeczywistych plików w repo, co pozwala na pracę nad (edycja, itp.) akta.

 20
Author: mipadi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-04 15:41:04

Nagie repozytorium ma zalety w

  • zmniejszone zużycie dysku
  • mniej problemów związanych ze zdalnym push (ponieważ żadne działające drzewo nie jest tam, aby wydostać się z synchronizacji lub mieć sprzeczne zmiany)
 17
Author: sehe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-04 15:48:38

Default/non-bare Git repo zawiera dwie części stanu:

  1. A migawka wszystkich plików w repozytorium (to właśnie oznacza "drzewo robocze" w żargonie Gita)
  2. A Historia wszystkich zmian wprowadzonych do wszystkich plików, które kiedykolwiek były w repozytorium (wydaje się, że nie ma zwięzłego żargonu Gita, który obejmuje to wszystko)

Migawka jest tym, co prawdopodobnie myślisz o swoim projekcie: plikach kodu, plikach budowania, helper scripts, i wszystko inne wersja z Git.

Historia to stan, który pozwala sprawdzić inny commit i uzyskać pełną migawkę tego, jak wyglądały pliki w repozytorium, gdy ten commit został dodany. Składa się z kilku struktur danych, które są wewnętrzne dla Gita, z którymi prawdopodobnie nigdy nie korzystałeś bezpośrednio. Co ważne, historia nie przechowuje tylko metadanych (np. " użytkownik u dodał tyle wierszy do pliku F w czasie T jako część Commit C"), przechowuje również dane (np. "użytkownik u dodał te dokładne linie do pliku F").

Kluczową ideą gołego repozytorium jest to, że w rzeczywistości nie trzeba mieć migawki. Git zachowuje migawkę, ponieważ jest wygodna dla ludzi i innych procesów spoza Git, które chcą wchodzić w interakcję z Twoim kodem, ale migawka jest tylko duplikacją stanu, który jest już w historii.

A bare repozytorium jest repozytorium Git, które nie posiada migawki. To po prostu przechowuje historię.

Po co ci to? Cóż, jeśli tylko będziesz wchodzić w interakcje z plikami za pomocą Git (to znaczy, nie będziesz edytować plików bezpośrednio lub używać ich do tworzenia plików wykonywalnych), możesz zaoszczędzić miejsce, nie trzymając się migawki. W szczególności, jeśli utrzymujesz scentralizowaną wersję swojego repo na serwerze gdzieś (tj. zasadniczo hostujesz własny GitHub), ten serwer powinien prawdopodobnie mieć gołe repo (nadal używałbyś nie-gołego repo na serwerze). twój lokalny komputer, ponieważ prawdopodobnie będziesz chciał edytować migawkę).

Jeśli chcesz bardziej dogłębnego wyjaśnienia gołych transakcji repo i innego przykładowego przypadku użycia, napisałem post na blogu tutaj: https://stegosaurusdormant.com/bare-git-repo/

 14
Author: Greg Owen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-11 22:09:43

Non bare repozytorium pozwala na (do pracującego drzewa) przechwytywanie zmian poprzez tworzenie nowych commitów.

Nagie repozytoria są zmieniane tylko przez transportowanie zmian z innych repozytoriów.

 12
Author: Nitin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-02 09:24:08

Na pewno nie jestem "ekspertem". Używałem TortoiseGit przez jakiś czas i zastanawiałem się, o czym mówi, gdy zapytał mnie, czy chcę zrobić "gołe" repo, gdy tylko go stworzyłem. Czytałam ten tutorial: https://www.atlassian.com/git/tutorials/setting-up-a-repository/git-init i odnosi się do problemu, ale nadal nie do końca rozumiałem tę koncepcję. Ten bardzo pomógł: http://bitflop.com/tutorials/git-bare-vs-non-bare-repositories.html. Teraz pierwszy też ma sens!

Zgodnie z tymi źródłami, w skrócie "gołe" repo jest używane na serwerze, na którym chcesz skonfigurować punkt dystrybucji. Nie jest przeznaczony do użytku na lokalnym komputerze. Zazwyczaj wypychasz commity ze swojej lokalnej Maszyny do gołego repo na zdalnym serwerze, a Ty i/lub inni pobieracie z tego gołego repo do lokalnej maszyny. Więc Twój GitHub, Assembla itp. remote storage / distribution repo to przykład, w którym tworzony jest "goły" repo. Zrobiłbyś sam, jeśli zakładałeś własne analogiczne "centrum udostępniania".

 10
Author: BuvinJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-11 14:21:11

To nie jest nowa odpowiedź, ale pomogła mi zrozumieć różne aspekty powyższych odpowiedzi (i to za dużo na komentarz).

Użyj Git Bash po prostu spróbuj:

me@pc MINGW64 /c/Test
$ ls -al
total 16
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:35 ./
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:11 ../

me@pc MINGW64 /c/Test
$ git init
Initialized empty Git repository in C:/Test/.git/

me@pc MINGW64 /c/Test (master)
$ ls -al
total 20
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:35 ./
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:11 ../
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:35 .git/

me@pc MINGW64 /c/Test (master)
$ cd .git

me@pc MINGW64 /c/Test/.git (GIT_DIR!)
$ ls -al
total 15
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 ./
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 ../
-rw-r--r-- 1 myid 1049089 130 Apr  1 11:35 config
-rw-r--r-- 1 myid 1049089  73 Apr  1 11:35 description
-rw-r--r-- 1 myid 1049089  23 Apr  1 11:35 HEAD
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 hooks/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 info/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 objects/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 refs/

To samo z git --bare:

me@pc MINGW64 /c/Test
$ ls -al
total 16
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:36 ./
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:11 ../

me@pc MINGW64 /c/Test
$ git init --bare
Initialized empty Git repository in C:/Test/

me@pc MINGW64 /c/Test (BARE:master)
$ ls -al
total 23
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 ./
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:11 ../
-rw-r--r-- 1 myid 1049089 104 Apr  1 11:36 config
-rw-r--r-- 1 myid 1049089  73 Apr  1 11:36 description
-rw-r--r-- 1 myid 1049089  23 Apr  1 11:36 HEAD
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 hooks/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 info/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 objects/
 4
Author: Christoph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-03 09:52:09

$ git help repository-layout

Repozytorium Git występuje w dwóch różnych smakach:

  • a .katalog git w korzeniu drzewa roboczego;
  • a .katalog git, który jest repozytorium nagim (tzn. bez własnego drzewa roboczego), który jest zazwyczaj używany do wymiany historii z innymi poprzez wepchnięcie do niego i pobranie z niego.
 2
Author: MichK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55