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/work
n'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/work
et 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 branch
ne 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 adelphus@example.com
> git commit -m "added afile"
[master (root-commit) 614ab02] added afile
1 file changed, 1 insertion(+)
create mode 100644 afile.txt
Les git config
commandes 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 master
branche 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-upstream
n'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' -u
indicateur 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.
--shared
optioninit
si 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