Estou adicionando esta resposta porque, depois de chegar aqui (com a mesma pergunta), nenhuma das respostas realmente descreve todas as etapas necessárias necessárias para ir do nada a um repositório remoto (totalmente) totalmente utilizável.
Nota: este exemplo usa caminhos locais para a localização do repositório vazio, mas outros protocolos git (como SSH indicado pelo OP) devem funcionar bem.
Tentei adicionar algumas notas ao longo do caminho para aqueles menos familiarizados com o git.
1. Inicialize o repositório simples ...
> git init --bare /path/to/bare/repo.git
Initialised empty Git repository in /path/to/bare/repo.git/
Isso cria uma pasta (repo.git) e a preenche com arquivos git representando um repo git. Tal como está, este repositório é inútil - não tem commits e, mais importante, não tem ramos . Embora você possa clonar este repositório, não pode retirá-lo.
Em seguida, precisamos criar uma pasta de trabalho. Existem algumas maneiras de fazer isso, dependendo se você possui arquivos existentes.
2a Crie uma nova pasta de trabalho (sem arquivos existentes) clonando o repositório vazio
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.
Este comando só funcionará se /path/to/worknão existir ou for uma pasta vazia. Tome nota do aviso - nesta fase, você ainda não tem nada útil. Se você cd /path/to/workexecutar git status, obterá algo como:
On branch master
Initial commit
nothing to commit (create/copy files and use "git add" to track)
mas isso é mentira. Você não está realmente no ramo master(porque git branchnão retorna nada) e, até agora, não há confirmações.
Em seguida, copie / mova / crie alguns arquivos na pasta de trabalho, adicione-os ao git e crie o primeiro 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
Os git configcomandos são necessários apenas se você ainda não disse ao git quem você é. Observe que se você executar agora git branch, verá a masterramificação listada. Agora execute 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
Isso também é enganador - o upstream não "foi", apenas não foi criado ainda e git branch --unset-upstreamnão ajudará. Mas tudo bem, agora que temos nosso primeiro commit, podemos enviar por push e master será criado no repositório simples.
> 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
Neste ponto, temos um repositório bare totalmente funcional que pode ser clonado em outro lugar em uma ramificação principal, bem como uma cópia de trabalho local que pode ser puxada e empurrada.
> git pull
Already up-to-date.
> git push origin master
Everything up-to-date
2b. Criar uma pasta de trabalho a partir de arquivos existentes
Se você já possui uma pasta com arquivos (para não poder cloná-la), pode inicializar um novo repositório git, adicionar um primeiro commit e vinculá-lo ao repositório bare posteriormente.
> 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
...
Nesse ponto, temos nosso primeiro commit e um branch master local, que precisamos transformar em um branch upstream rastreado remotamente.
> 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.
Observe a -uflag no git push para definir o (novo) ramo upstream rastreado. Assim como antes, agora temos um repositório vazio totalmente funcional que pode ser clonado em outro lugar em uma ramificação principal, bem como uma cópia de trabalho local que pode ser puxada e empurrada.
Tudo isso pode parecer óbvio para alguns, mas o git me confunde na melhor das hipóteses (as mensagens de erro e status realmente precisam de retrabalho) - espero que isso ajude outros.
--sharedopçãoinitse planeja fazer com que outras pessoas enviem este repositório. Ele adiciona automaticamente as permissões de gravação do grupo para o repositório - ligação