J'ai lu sur les référentiels nus et non nus / par défaut dans Git. Je n'ai pas été en mesure de bien comprendre (théoriquement) les différences entre eux, et pourquoi je devrais "pousser" vers un référentiel nu. Voici l'affaire:
Actuellement, je suis le seul à travailler sur un projet sur 3 ordinateurs différents, mais il y aura plus de personnes impliquées plus tard, donc j'utilise Git pour le contrôle de version. Je clone le référentiel nu sur tous les ordinateurs, et lorsque je termine mes modifications sur l'un d'entre eux, je valide et pousse les modifications apportées au référentiel nu. D'après ce que j'ai lu, le dépôt nu n'a PAS "d'arbre de travail", donc si je clone le dépôt nu, je n'aurai pas "d'arbre de travail".
Je suppose que l'arborescence de travail stocke les informations de validation, les branches, etc. du projet. Cela n'apparaîtrait pas dans le repo nu. Il me semble donc préférable de "pousser" les commits vers le repo avec l'arbre de travail.
Alors, pourquoi devrais-je utiliser le dépôt nu et pourquoi pas? Quelle est la différence pratique? Cela ne serait pas avantageux pour plus de personnes travaillant sur un projet, je suppose.
Quelles sont vos méthodes pour ce genre de travail? Suggestions?
la source
git clone
vous pouvez librement convertir entre les référentiels nus et non nus.git clone --bare
vous obtiendrez un dépôt nu, et si vous exécutezgit clone
, vous obtiendrez un non-nu. Chaque projet public que vous avez déjà cloné (hébergé sur github, par exemple) est un référentiel nu à l'autre bout.Réponses:
Une autre différence entre un référentiel nu et non nu est qu'un référentiel nu n'a pas de référentiel d' origine distant par défaut :
À partir de la page de manuel pour
git clone --bare
:Vraisemblablement, lorsqu'il crée un référentiel nu, Git suppose que le référentiel nu servira de référentiel d'origine pour plusieurs utilisateurs distants, donc il ne crée pas l'origine distante par défaut. Cela signifie que les opérations de base
git pull
etgit push
ne fonctionneront pas, car Git suppose que sans espace de travail, vous n'avez pas l'intention de valider les modifications du référentiel nu:la source
git clone --no-checkout
peut également créer un référentiel non nu sans fichiers d'espace de travail.git init
, ce qui créera un dépôt non nu sans aucune télécommande spécifiée.clone
édité. S'il a étéinit
édité localement, il n'aura pas une telle origine. Cela n'a rien à voir avec le fait qu'il soit nu ou non.La distinction entre un référentiel Git nu et non nu est artificielle et trompeuse car un espace de travail ne fait pas partie du référentiel et un référentiel ne nécessite pas d'espace de travail. À strictement parler, un référentiel Git comprend les objets qui décrivent l'état du référentiel. Ces objets peuvent exister dans n'importe quel répertoire, mais existent généralement dans le
.git
répertoire du répertoire de niveau supérieur de l'espace de travail. L'espace de travail est une arborescence de répertoires qui représente une validation particulière dans le référentiel, mais elle peut exister dans n'importe quel répertoire ou pas du tout. La variable d'environnement$GIT_DIR
relie un espace de travail au référentiel dont il est issu.Les commandes Git
git clone
et lesgit init
deux ont des options--bare
qui créent des référentiels sans espace de travail initial. Il est regrettable que Git fusionne les deux concepts distincts, mais liés, d'espace de travail et de référentiel, puis utilise le terme déroutant nu pour séparer les deux idées.la source
Un dépôt nu n'est rien d'autre que le dossier .git lui-même, c'est-à-dire que le contenu d'un dépôt nu est le même que le contenu du dossier .git à l' intérieur de votre dépôt de travail local.
la source
5 ans trop tard, je sais, mais personne n'a répondu à la question:
Pour citer directement le livre de Loeliger / MCullough (978-1-449-31638-9, p196 / 7):
la source
Un référentiel non nu possède simplement une arborescence de travail extraite. L'arbre de travail ne stocke aucune information sur l'état du référentiel (branches, balises, etc.); au lieu de cela, l'arborescence de travail n'est qu'une représentation des fichiers réels dans le référentiel, ce qui vous permet de travailler (éditer, etc.) les fichiers.
la source
git clone --no-checkout
. Dans ce cas, le référentiel non nu a un emplacement pour l'espace de travail, mais Git ne récupère aucun fichier dans cet espace de travail.Un référentiel nu présente des avantages dans
la source
Le référentiel non nu vous permet (dans votre arborescence de travail) de capturer les modifications en créant de nouveaux commits.
Les référentiels nus ne sont modifiés qu'en transportant les modifications à partir d'autres référentiels.
la source
Je ne suis certainement pas un "expert" Git. J'ai utilisé TortoiseGit pendant un certain temps et je me demandais de quoi il parlait quand il m'a demandé si je voulais faire un dépôt "nu" chaque fois que j'en créais un. Je lisais ce tutoriel: https://www.atlassian.com/git/tutorials/setting-up-a-repository/git-init et il résout le problème, mais je ne comprenais toujours pas bien le concept. Celui-ci a beaucoup aidé: http://bitflop.com/tutorials/git-bare-vs-non-bare-repositories.html . Maintenant, le premier est également logique!
Selon ces sources, en bref, un dépôt "nu" est utilisé sur un serveur sur lequel vous souhaitez configurer un point de distribution. Il n'est pas destiné à être utilisé sur votre ordinateur local. Vous transférez généralement les validations de votre ordinateur local vers un référentiel nu sur un serveur distant, et vous et / ou d'autres tirez de ce référentiel nu vers votre ordinateur local. Ainsi, votre référentiel de stockage / distribution à distance GitHub, Assembla, etc. est un exemple où un référentiel "nu" est créé. Vous en feriez un vous-même si vous mettiez en place votre propre "centre de partage" analogue.
la source
Un dépôt Git par défaut / non nu contient deux éléments d'état:
L' instantané est ce que vous pensez probablement comme votre projet: vos fichiers de code, les fichiers de construction, les scripts d'aide et tout ce que vous versionnez avec Git.
L' historique est l'état qui vous permet d'extraire un autre commit et d'obtenir un instantané complet de l'apparence des fichiers de votre référentiel lorsque ce commit a été ajouté. Il se compose d'un tas de structures de données internes à Git avec lesquelles vous n'avez probablement jamais interagi directement. Surtout, l'historique ne stocke pas seulement les métadonnées (par exemple "L'utilisateur U a ajouté autant de lignes au fichier F au temps T dans le cadre de la validation C"), il stocke également les données (par exemple "L'utilisateur U a ajouté ces lignes exactes au fichier F" ).
L'idée clé d'un référentiel nu est que vous n'avez pas réellement besoin d'avoir l'instantané. Git conserve l'instantané, car il est pratique pour les humains et les autres processus non-Git qui veulent interagir avec votre code, mais l'instantané ne fait que dupliquer l'état qui est déjà dans l'historique.
Un référentiel nu est un référentiel Git qui n'a pas d'instantané. Il stocke juste l'histoire.
Pourquoi voudriez-vous cela? Eh bien, si vous allez uniquement interagir avec vos fichiers à l'aide de Git (c'est-à-dire que vous n'allez pas modifier vos fichiers directement ou les utiliser pour créer un exécutable), vous pouvez économiser de l'espace en ne restant pas sur l'instantané. En particulier, si vous maintenez une version centralisée de votre référentiel sur un serveur quelque part (c'est-à-dire que vous hébergez essentiellement votre propre GitHub), ce serveur devrait probablement avoir un référentiel nu (vous utiliseriez toujours un référentiel non nu sur votre machine locale, car vous voudrez probablement modifier votre instantané).
Si vous voulez une explication plus approfondie des dépôts nus et un autre exemple d'utilisation, j'ai rédigé un article de blog ici: https://stegosaurusdormant.com/bare-git-repo/
la source
Ce n'est pas une nouvelle réponse, mais cela m'a aidé à comprendre les différents aspects des réponses ci-dessus (et c'est trop pour un commentaire).
En utilisant Git Bash, essayez simplement:
Idem avec
git --bare
:la source
$ git help repository-layout
la source