Я добавляю этот ответ, потому что после прибытия сюда (с тем же вопросом) ни один из ответов на самом деле не описывает все необходимые шаги, необходимые для перехода от ничего к полностью пригодному для использования удаленному (голому) репо.
Примечание: в этом примере используются локальные пути для определения местоположения репо, но другие протоколы git (например, SSH, указанный в OP) должны работать нормально.
Я попытался добавить несколько заметок по пути для тех, кто менее знаком с git.
1. Инициализировать голое репо ...
> git init --bare /path/to/bare/repo.git
Initialised empty Git repository in /path/to/bare/repo.git/
Это создает папку (repo.git) и заполняет ее git-файлами, представляющими git-репо. В настоящее время это репо бесполезно - у него нет коммитов и, что более важно, нет веток . Хотя вы можете клонировать этот репо, вы не можете вытащить его.
Далее нам нужно создать рабочую папку. Есть несколько способов сделать это, в зависимости от того, есть ли у вас файлы.
2a. Создайте новую рабочую папку (без существующих файлов), клонируя пустое хранилище
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.
Эта команда будет работать, только если /path/to/work
не существует или является пустой папкой.
Примите к сведению предупреждение - на этом этапе у вас все еще нет ничего полезного. Если вы cd /path/to/work
и запустите git status
, вы получите что-то вроде:
On branch master
Initial commit
nothing to commit (create/copy files and use "git add" to track)
но это ложь. Вы на самом деле не находитесь на ветке master
(потому что git branch
ничего не возвращает) и пока нет коммитов.
Затем скопируйте / переместите / создайте некоторые файлы в рабочей папке, добавьте их в git и создайте первый коммит.
> 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
Команды git config
нужны только в том случае, если вы еще не сказали git, кто вы. Обратите внимание, что если вы теперь запустите git branch
, вы увидите ветку master
в списке. Теперь запустите 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
Это также вводит в заблуждение - апстрим не "ушел", он просто еще не создан и git branch --unset-upstream
не поможет. Но это нормально, теперь, когда у нас есть первый коммит, мы можем нажать и мастер будет создан на голом репо.
> 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
На данный момент у нас есть полностью функциональное голое репо, которое можно клонировать в другом месте главной ветки, а также локальная рабочая копия, которая может тянуть и толкать.
> git pull
Already up-to-date.
> git push origin master
Everything up-to-date
2b. Создать рабочую папку из существующих файлов
Если у вас уже есть папка с файлами в ней (поэтому вы не можете клонировать ее), вы можете инициализировать новое git-репо, добавить первый коммит и затем связать его с голым репо.
> 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
...
На данный момент у нас есть наш первый коммит и локальная основная ветвь, которую нам нужно превратить в удаленную отслеживаемую ветвь ветки.
> 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.
Обратите внимание на флаг -u
на git push, чтобы установить (новую) отслеживаемую восходящую ветвь.
Как и раньше, теперь у нас есть полностью функциональное голое репо, которое можно клонировать в другом месте главной ветки, а также локальная рабочая копия, которая может тянуть и толкать.
Некоторым все это может показаться очевидным, но git в лучшем случае смущает меня (это сообщения об ошибках и сообщения о состоянии действительно требуют доработки) - надеюсь, это поможет другим.