Comment utilisez-vous le dépôt «git --bare init»?

321

J'ai besoin de créer un dépôt Git central mais je suis un peu confus ...

J'ai créé un référentiel nu (sur mon serveur git, machine 2) avec:

$ mkdir test_repo
$ git --bare init

Maintenant, je dois pousser des fichiers de mon référentiel local (machine 1) vers le référentiel nu (machine 2). J'ai accès à la machine 2 par SSH. Le fait est que je pense que je ne comprends pas le concept d'un référentiel nu ...

Quelle est la bonne façon de stocker mon code dans le référentiel nu? Comment transférer des modifications de mon référentiel local vers le référentiel nu?

Est-ce la bonne façon d'avoir un référentiel central pour avoir un référentiel nu?

Je suis un peu confus avec ce sujet. Veuillez me donner un indice à ce sujet.

André
la source

Réponses:

392

Tout d'abord, juste pour vérifier, vous devez vous changer dans le répertoire que vous avez créé avant de lancer git init --bare. En outre, il est classique de donner l'extension aux référentiels nus .git. Vous pouvez donc faire

git init --bare test_repo.git

Pour les versions Git <1.8, vous feriez

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

Pour répondre à vos questions ultérieures, les référentiels nus (par définition) ne sont pas associés à une arborescence de travail, vous ne pouvez donc pas facilement y ajouter des fichiers comme vous le feriez dans un référentiel normal non nue (par exemple avec git add <file>et une version ultérieure) git commit. )

Vous mettez presque toujours à jour un référentiel nu en le poussant (en utilisant git push) à partir d'un autre référentiel.

Notez que dans ce cas, vous devrez d'abord autoriser les utilisateurs à accéder à votre référentiel. À l'intérieur test_repo.git, faites

git config receive.denyCurrentBranch ignore

Modification de la communauté

git init --bare --shared=group

Comme l'a commenté prasanthv, c'est ce que vous voulez si vous faites cela au travail, plutôt que pour un projet de maison privée.

Mark Longair
la source
7
Vous pouvez également ajouter l' --sharedoption initsi vous envisagez de faire pousser d'autres personnes vers ce dépôt. Il ajoute automatiquement des autorisations d'écriture de groupe au référentiel - lien
prasanthv
17
Je pense que ces trois lignes ont le même effet que cette seule: git --bare init test_repo.git Au moins avec ma version actuelle de git (1.8.2.2)
Fran Marzoa
1
utile si vous voulez connaître la différence entre les repos nu et non nu stackoverflow.com/questions/7861184/…
Guille Acosta
comment git trouve-t-il des choses s'il n'y a pas d'arbre de travail? je pensais qu'il y avait un arbre de travail dans le magasin d'objets git, et c'est ce que les SHA intermédiaires pointent et commettent
akantoword
@akantoword: git stocke toutes les informations sur les commits et les branches quelque part. Un commit est probablement principalement un diff entre la version précédente des fichiers et la nouvelle version. L'arbre de travail n'est qu'un instantané de son contenu réel à un moment précis. Quoi qu'il en soit, avec un arbre de travail, vous pouvez aller et venir entre les validations et les branches. Vous pouvez même commander sur une autre arborescence de travail si vous le souhaitez.
user276648
246

J'ajoute cette réponse car après être arrivé ici (avec la même question), aucune des réponses ne décrit vraiment toutes les étapes nécessaires pour passer de rien à un référentiel distant (nu) entièrement utilisable.

Remarque: cet exemple utilise des chemins locaux pour l'emplacement du dépôt nu, mais d'autres protocoles git (comme SSH indiqué par l'OP) devraient fonctionner très bien.

J'ai essayé d'ajouter quelques notes en cours de route pour ceux qui connaissent moins git.

1. Initialisez le dépôt nu ...

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

Cela crée un dossier (repo.git) et le remplit avec des fichiers git représentant un dépôt git. En l'état, ce dépôt est inutile - il n'a pas de commits et, surtout, pas de succursales . Bien que vous puissiez cloner ce dépôt, vous ne pouvez pas en retirer.

Ensuite, nous devons créer un dossier de travail. Il existe plusieurs façons de procéder, selon que vous avez ou non des fichiers existants.

2a. Créez un nouveau dossier de travail (aucun fichier existant) en clonant le référentiel vide

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.

Cette commande ne fonctionnera que si elle /path/to/workn'existe pas ou s'il s'agit d'un dossier vide. Prenez note de l'avertissement - à ce stade, vous n'avez toujours rien d'utile. Si vous cd /path/to/worket courez git status, vous obtiendrez quelque chose comme:

On branch master

Initial commit

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

mais c'est un mensonge. Vous n'êtes pas vraiment sur la branche master(car git branchne renvoie rien) et jusqu'à présent, il n'y a pas de commit.

Ensuite, copiez / déplacez / créez des fichiers dans le dossier de travail, ajoutez-les à git et créez le premier commit.

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

Les git configcommandes ne sont nécessaires que si vous n'avez pas déjà dit à git qui vous êtes. Notez que si vous exécutez maintenant git branch, vous verrez maintenant la masterbranche répertoriée. Maintenant, lancez 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

C'est également trompeur - l'amont n'a pas "disparu", il n'a tout simplement pas encore été créé et git branch --unset-upstreamn'aidera pas. Mais ça va, maintenant que nous avons notre premier commit, nous pouvons pousser et master sera créé sur le repo nu.

> 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

À ce stade, nous avons un référentiel nu entièrement fonctionnel qui peut être cloné ailleurs sur une branche principale ainsi qu'une copie de travail locale qui peut tirer et pousser.

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

2b. Créer un dossier de travail à partir de fichiers existants Si vous avez déjà un dossier contenant des fichiers (vous ne pouvez donc pas le cloner), vous pouvez initialiser un nouveau dépôt git, ajouter un premier commit puis le lier au dépôt nu par la suite.

> 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
...

À ce stade, nous avons notre premier commit et une branche maître locale que nous devons transformer en une branche amont à distance.

> 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.

Notez l' -uindicateur sur git push pour définir la (nouvelle) branche amont suivie. Tout comme auparavant, nous avons maintenant un dépôt nu entièrement fonctionnel qui peut être cloné ailleurs sur une branche principale ainsi qu'une copie de travail locale qui peut être tirée et poussée.

Tout cela peut sembler évident pour certains, mais git me confond dans le meilleur des cas (ce sont des messages d'erreur et d'état qui ont vraiment besoin d'être retravaillés) - j'espère que cela aidera les autres.

adelphus
la source
4
Intéressant. Certainement plus détaillé que ma réponse. +1
VonC
13
Cette réponse résout mon problème et devrait être la réponse acceptée, j'espère que de plus en plus de gens pourront voter.
inix
11
Vous devez facturer de l'argent pour des réponses comme celle-ci
Arthur Tarasov
2
En tant que nouvel utilisateur de git, cette réponse m'a été extrêmement utile, merci d'avoir écrit ceci!
sidewinderguy
1
Ceci est une brillante réponse. Aidera beaucoup notre unité.
wobsoriano
33

Répondre à vos questions une par une:

Le référentiel nu est celui qui n'a pas d'arbre de travail . Cela signifie que tout son contenu est ce que vous avez dans le .gitrépertoire.

Vous pouvez uniquement mettre commità nu le référentiel en y pushaccédant à partir de votre clone local. Il n'a pas d'arbre de travail, il n'a donc pas de fichiers modifiés, pas de changements.

Avoir un référentiel central la seule façon c'est d'avoir un bareréférentiel.

Marcin Gil
la source
22

Vous pouvez également demander à git de créer un répertoire pour vous:

git init --bare test_repo.git
Serge S.
la source
20

La pratique générale consiste à disposer du référentiel central vers lequel vous effectuez une mise en dépôt nue.

Si vous avez des antécédents SVN, vous pouvez associer un dépôt SVN à un dépôt nu Git. Il ne contient pas les fichiers du dépôt sous leur forme d'origine. Alors que votre dépôt local aura en plus les fichiers qui forment votre "code".

Vous devez ajouter une télécommande au référentiel nu à partir de votre référentiel local et y pousser votre "code".

Ce sera quelque chose comme:

git remote add central <url> # url will be ssh based for you
git push --all central
manojlds
la source
En utilisant git remote add central <url>, dans le cas de SSH, cela inclurait-il également le chemin? par exemplegit remote add central ssh://user@server/home/user/repo.git
Oui Barry
17

Cela devrait suffire:

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

Voir pour plus de détails " GIT: Comment mettre à jour mon référentiel nu? ".
Remarques:

  • vous pouvez utiliser un nom différent de ' origin' pour la référence à distance du référentiel nu.
  • cela ne poussera pas vos balises, vous en avez besoin git push --tags originpour cela.
VonC
la source
5

Il est bon de vérifier que le code que vous avez poussé a bien été validé.

Vous pouvez obtenir un journal des modifications sur un référentiel nu en définissant explicitement le chemin à l'aide de l'option --relative.

$ cd test_repo
$ git log --relative=/

Cela vous montrera les modifications validées comme s'il s'agissait d'un dépôt git normal.

Russell
la source
5

D'après les réponses de Mark Longair et Roboprog:

si version git> = 1.8

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

Ou :

si version git <1.8

mkdir .git
cd .git
git init --bare --shared=group 
git config receive.denyCurrentBranch ignore
Jack'
la source
Cette commande de configuration: comment finit-elle par s'appliquer au répertoire .git que vous venez de créer?
GreenAsJade
Je ne suis pas sûr de comprendre votre question? Pouvez-vous être plus précis? Puisque vous avez initialisé votre dépôt git, vous pouvez le configurer autant que vous le souhaitez avec la commande 'git config' ..
Jack '
@GreenAsJade C'est parce que vous êtes toujours dans le dossier du dépôt git, donc cela s'applique à cela (la valeur par défaut de la configuration git est comme l'option --local).
BlueCoder
2

L'indicateur --bare crée un référentiel qui n'a pas de répertoire de travail. Le référentiel nu est le référentiel central et vous ne pouvez pas modifier (stocker) les codes ici pour éviter l'erreur de fusion.

Par exemple, lorsque vous ajoutez un fichier dans votre référentiel local (machine 1) et le poussez vers le référentiel nu, vous ne pouvez pas voir le fichier dans le référentiel nu car il est toujours «vide». Cependant, vous poussez vraiment quelque chose dans le référentiel et vous pouvez le voir inexplicitement en clonant un autre référentiel sur votre serveur (machine 2).

Le référentiel local de la machine 1 et le référentiel «copie» de la machine 2 sont non nus. relation entre les référentiels nus et non nus

Le blog vous aidera à le comprendre. https://www.atlassian.com/git/tutorials/setting-up-a-repository

Jie Zhang
la source
0

Vous pouvez exécuter les commandes suivantes pour initialiser votre référentiel local

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

Vous devez travailler sur votre projet à partir de votre référentiel local et utiliser le serveur comme référentiel central.

Vous pouvez également suivre cet article qui explique chaque aspect de la création et de la maintenance d'un référentiel Git. Git pour les débutants

Sameer Ranjan
la source