Ich habe über die nackten und nicht nackten / Standard-Repositores in Git gelesen. Ich war nicht in der Lage, (theoretisch) die Unterschiede zwischen ihnen zu verstehen und warum ich in ein nacktes Repository "pushen" sollte. Das ist der Deal:
Derzeit bin ich der einzige, der an einem Projekt auf 3 verschiedenen Computern arbeitet, aber später werden mehr Leute daran beteiligt sein, daher verwende ich Git für die Versionskontrolle. Ich klone das Bare-Repo auf allen Computern, und wenn ich meine Änderungen an einem von ihnen abgeschlossen habe, übertrage ich die Änderungen und übertrage sie auf das Bare-Repo. Nach dem, was ich gelesen habe, hat das Bare-Repository KEINEN "Arbeitsbaum". Wenn ich also das Bare-Repo klone, habe ich keinen "Arbeitsbaum".
Ich vermute, dass der Arbeitsbaum die Festschreibungsinformationen, Zweige usw. aus dem Projekt speichert. Das würde nicht im nackten Repo erscheinen. Daher scheint es für mich besser zu sein, die Commits mit dem Arbeitsbaum zum Repo zu "pushen".
Dann warum soll ich das blanke Repository verwenden und warum nicht? Was ist der praktische Unterschied? Das wäre wohl nicht vorteilhaft für mehr Leute, die an einem Projekt arbeiten.
Was sind Ihre Methoden für diese Art von Arbeit? Vorschläge?
quelle
git clone
Sie also frei zwischen nackten und nicht nackten Repositorys konvertieren.git clone --bare
rennst, bekommst du ein nacktes Repo, und wenn du rennstgit clone
, bekommst du ein nicht nacktes. Jedes öffentliche Projekt, das Sie jemals geklont haben (z. B. auf Github gehostet), ist am anderen Ende ein nacktes Repository.Antworten:
Ein weiterer Unterschied zwischen einem nackten und einem nicht nackten Repository besteht darin, dass ein nacktes Repository kein Standard-Remote- Ursprungs- Repository hat:
Aus der Handbuchseite für
git clone --bare
:Vermutlich geht Git beim Erstellen eines Bare-Repositorys davon aus, dass das Bare-Repository als Ursprungs-Repository für mehrere Remote-Benutzer dient, sodass nicht der Standard-Remote-Ursprung erstellt wird. Dies bedeutet, dass Basic
git pull
undgit push
Operationen nicht funktionieren, da Git davon ausgeht, dass Sie ohne Arbeitsbereich keine Änderungen am nackten Repository vornehmen möchten:quelle
git clone --no-checkout
kann jedoch auch ein nicht nacktes Repository ohne Arbeitsbereichsdateien erstellen.git init
erstellen, das ein nicht nacktes Repo ohne Remote-Angabe erstellt.clone
bearbeitet wurde. Wenn esinit
lokal bearbeitet wurde, hat es keinen solchen Ursprung. Dies hat nichts damit zu tun, ob es kahl ist oder nicht.Die Unterscheidung zwischen einem nackten und einem nicht nackten Git-Repository ist künstlich und irreführend, da ein Arbeitsbereich nicht Teil des Repositorys ist und ein Repository keinen Arbeitsbereich benötigt. Genau genommen enthält ein Git-Repository diejenigen Objekte, die den Status des Repositorys beschreiben. Diese Objekte können in einem beliebigen Verzeichnis vorhanden sein, befinden sich jedoch normalerweise im
.git
Verzeichnis im obersten Verzeichnis des Arbeitsbereichs. Der Arbeitsbereich ist ein Verzeichnisbaum, der ein bestimmtes Commit im Repository darstellt, aber in jedem Verzeichnis vorhanden sein kann oder überhaupt nicht. Die Umgebungsvariable$GIT_DIR
verknüpft einen Arbeitsbereich mit dem Repository, aus dem er stammt.Git-Befehle
git clone
undgit init
beide haben Optionen--bare
, mit denen Repositorys ohne anfänglichen Arbeitsbereich erstellt werden. Es ist bedauerlich, dass Git die beiden getrennten, aber verwandten Konzepte von Arbeitsbereich und Repository zusammenführt und dann den verwirrenden Begriff bare verwendet , um die beiden Ideen zu trennen.quelle
Ein nacktes Repository ist nichts anderes als der .git- Ordner selbst, dh der Inhalt eines nackten Repositorys entspricht dem Inhalt des .git- Ordners in Ihrem lokalen Arbeitsrepository.
quelle
5 Jahre zu spät, ich weiß, aber niemand hat die Frage tatsächlich beantwortet:
Um direkt aus dem Loeliger / MCullough-Buch (978-1-449-31638-9, S. 196/7) zu zitieren:
quelle
Ein nicht nacktes Repository verfügt lediglich über einen ausgecheckten Arbeitsbaum. Der Arbeitsbaum speichert keine Informationen über den Status des Repositorys (Zweige, Tags usw.). Vielmehr ist der Arbeitsbaum nur eine Darstellung der tatsächlichen Dateien im Repo, mit denen Sie die Dateien bearbeiten (bearbeiten usw.) können.
quelle
git clone --no-checkout
. In diesem Fall hat das nicht nackte Repository einen Speicherort für den Arbeitsbereich, aber Git checkt keine Dateien in diesen Arbeitsbereich aus.Ein nacktes Repository hat Vorteile in
quelle
Mit dem nicht nackten Repository können Sie (in Ihrem Arbeitsbaum) Änderungen erfassen, indem Sie neue Commits erstellen.
Bloße Repositorys werden nur durch den Transport von Änderungen aus anderen Repositorys geändert.
quelle
Ich bin sicher kein Git "Experte". Ich habe TortoiseGit für eine Weile verwendet und mich gefragt, worüber es sprach, als ich gefragt wurde, ob ich bei jeder Erstellung ein "nacktes" Repo machen möchte. Ich habe dieses Tutorial gelesen: https://www.atlassian.com/git/tutorials/setting-up-a-repository/git-init und es behebt das Problem, aber ich habe das Konzept immer noch nicht ganz verstanden. Dieser hat sehr geholfen: http://bitflop.com/tutorials/git-bare-vs-non-bare-repositories.html . Jetzt macht auch der erste Sinn!
Diesen Quellen zufolge wird kurz gesagt ein "nacktes" Repo auf einem Server verwendet, auf dem Sie einen Verteilungspunkt einrichten möchten. Es ist nicht für die Verwendung auf Ihrem lokalen Computer vorgesehen. Im Allgemeinen übertragen Sie Commits von Ihrem lokalen Computer auf ein Bare-Repo auf einem Remote-Server, und Sie und / oder andere ziehen von diesem Bare-Repo auf Ihren lokalen Computer. Ihr GitHub-, Assembla- usw. Remote-Speicher- / Distributions-Repo ist also ein Beispiel, in dem ein "nacktes" Repo erstellt wird. Sie würden selbst eines erstellen, wenn Sie Ihr eigenes analoges "Sharing Center" einrichten würden.
quelle
Ein Standard- / nicht nacktes Git-Repo enthält zwei Statuselemente:
Der Schnappschuss ist das, was Sie wahrscheinlich als Ihr Projekt betrachten: Ihre Codedateien, Build-Dateien, Hilfsskripte und alles andere, was Sie mit Git versionieren.
Der Verlauf ist der Status, mit dem Sie ein anderes Commit auschecken und einen vollständigen Überblick darüber erhalten können, wie die Dateien in Ihrem Repository ausgesehen haben, als dieses Commit hinzugefügt wurde. Es besteht aus einer Reihe von Git-internen Datenstrukturen, mit denen Sie wahrscheinlich noch nie direkt interagiert haben. Wichtig ist, dass im Verlauf nicht nur Metadaten gespeichert werden (z. B. "Benutzer U hat zum Zeitpunkt T im Rahmen von Commit C so viele Zeilen zu Datei F hinzugefügt"), sondern auch Daten (z. B. "Benutzer U hat diese genauen Zeilen zu Datei F hinzugefügt "). ).
Die Schlüsselidee eines nackten Repositorys ist, dass Sie den Snapshot nicht benötigen. Git behält den Snapshot bei, da er für Menschen und andere Nicht-Git-Prozesse geeignet ist, die mit Ihrem Code interagieren möchten. Der Snapshot dupliziert jedoch nur den Status, der bereits in der Historie enthalten ist.
Ein nacktes Repository ist ein Git-Repository ohne Snapshot. Es speichert nur die Geschichte.
Warum willst du das? Wenn Sie nur mit Git mit Ihren Dateien interagieren (dh Ihre Dateien nicht direkt bearbeiten oder zum Erstellen einer ausführbaren Datei verwenden), können Sie Platz sparen, indem Sie den Snapshot nicht beibehalten. Insbesondere wenn Sie eine zentralisierte Version Ihres Repos auf einem Server irgendwo verwalten (dh Sie hosten im Grunde Ihren eigenen GitHub), sollte dieser Server wahrscheinlich ein nacktes Repo haben (Sie würden immer noch ein nicht nacktes Repo auf Ihrem verwenden lokaler Computer, da Sie vermutlich Ihren Schnappschuss bearbeiten möchten).
Wenn Sie eine ausführlichere Erklärung von Bare-Repos und einen weiteren Anwendungsbeispiel wünschen, habe ich hier einen Blog-Beitrag verfasst: https://stegosaurusdormant.com/bare-git-repo/
quelle
Dies ist keine neue Antwort, aber es hat mir geholfen, die verschiedenen Aspekte der obigen Antworten zu verstehen (und es ist zu viel für einen Kommentar).
Mit Git Bash versuchen Sie einfach:
Gleiches gilt für
git --bare
:quelle
$ git help repository-layout
quelle