Как вы используете репозиторий "git --bare init"? - PullRequest
282 голосов
/ 03 октября 2011

Мне нужно создать центральное хранилище Git, но я немного запутался ...

Я создал голое хранилище (на моем git-сервере, машина 2) с:

$ mkdir test_repo
$ git --bare init

Теперь мне нужно отправить файлы из локального репозитория (машина 1) в пустой репозиторий (машина 2).У меня есть доступ к машине 2 по SSH.Дело в том, что я думаю, что не понимаю концепцию чистого репозитория ...

Как правильно хранить мой код в голом репозитории?Как я могу перенести изменения из моего локального репозитория в пустой репозиторий?

Правильный ли способ иметь центральный репозиторий, чтобы иметь пустой репозиторий?,Пожалуйста, дайте мне подсказку об этом.

Ответы [ 10 ]

350 голосов
/ 03 октября 2011

Во-первых, просто чтобы проверить, вам нужно перейти в каталог, который вы создали до запуска git init --bare. Кроме того, условно дать голым репозиториям расширение .git. Так что вы можете сделать

git init --bare test_repo.git

Для версий Git <1.8 вы бы сделали </p>

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

Чтобы ответить на ваши более поздние вопросы, к пустым репозиториям (по определению) не прикреплено рабочее дерево, поэтому вы не можете легко добавлять файлы к ним, как в обычном не пустом хранилище (например, с git add <file> и последующие git commit.)

Вы почти всегда обновляете пустой репозиторий, нажимая на него (используя git push) из другого репозитория.

Обратите внимание, что в этом случае вам сначала нужно разрешить пользователям публиковать данные в вашем хранилище. Находясь внутри test_repo.git, делайте

git config receive.denyCurrentBranch ignore

Сообщество редактировать

git init --bare --shared=group

Как прокомментировал prasanthv, это то, что вы хотите, если вы делаете это на работе, а не для частного дома.

211 голосов
/ 23 июля 2015

Я добавляю этот ответ, потому что после прибытия сюда (с тем же вопросом) ни один из ответов на самом деле не описывает все необходимые шаги, необходимые для перехода от ничего к полностью пригодному для использования удаленному (голому) репо.

Примечание: в этом примере используются локальные пути для определения местоположения репо, но другие протоколы 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 в лучшем случае смущает меня (это сообщения об ошибках и сообщения о состоянии действительно требуют доработки) - надеюсь, это поможет другим.

32 голосов
/ 03 октября 2011

Отвечая на ваши вопросы один за другим:

Голый репозиторий - это тот, у которого нет рабочего дерева .Это означает, что все его содержимое - это то, что у вас есть в каталоге .git.

Вы можете только commit получить доступ к хранилищу, push используя его из локального клона.У него нет рабочего дерева, поэтому у него нет измененных файлов, никаких изменений.

Единственный способ иметь центральное хранилище - это хранилище bare.

21 голосов
/ 18 января 2014

Вы также можете попросить git создать каталог для вас:

git init --bare test_repo.git
20 голосов
/ 03 октября 2011

Общая практика заключается в том, чтобы иметь центральное хранилище, в которое вы помещаете репозиторий.

Если у вас есть фон SVN, вы можете связать репозиторий SVN с репозиторием Git bare. У него нет файлов в репо в оригинальном виде. Принимая во внимание, что в вашем локальном репо будут также файлы, которые образуют ваш «код».

Вам необходимо добавить удаленный репозиторий в репозиторий из локального репозитория и вставить в него свой «код».

Это будет что-то вроде:

git remote add central <url> # url will be ssh based for you
git push --all central
17 голосов
/ 03 октября 2011

Этого должно быть достаточно:

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

Подробнее см. " GIT: Как мне обновить мое голое репо? ".
Примечания:

  • Вы можете использовать имя, отличное от 'origin' для удаленной ссылки на репо.
  • это не подтолкнет ваши теги, вам нужен отдельный git push --tags origin для этого.
5 голосов
/ 23 ноября 2017

Основано на ответах Mark Longair & Roboprog:

если версия git> = 1.8

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

Или:

, если версия git <1.8 </strong>

mkdir .git
cd .git
git init --bare --shared=group 
git config receive.denyCurrentBranch ignore
5 голосов
/ 20 октября 2011

Приятно убедиться, что код, который вы нажали, действительно был зафиксирован.

Вы можете получить журнал изменений в пустом хранилище, явно указав путь с помощью параметра --relative.

$ cd test_repo
$ git log --relative=/

Это покажет вам зафиксированные изменения, как если бы это было обычное git-репо.

2 голосов
/ 21 марта 2017

Флаг --bare создает репозиторий, в котором нет рабочего каталога.Пустой репозиторий является центральным репозиторием, и вы не можете редактировать (хранить) здесь коды, чтобы избежать ошибки слияния.

Например, когда вы добавляете файл в свой локальный репозиторий (компьютер 1) и помещаете его вв пустом хранилище вы не можете увидеть файл в пустом хранилище, поскольку он всегда «пустой».Тем не менее, вы действительно что-то толкаете в репозиторий, и вы можете увидеть это неявным образом, клонируя другой репозиторий на вашем сервере (машина 2).

Локальный репозиторий на машине 1 и репозиторий «копирования» на машине 2 не являются пустыми. отношения между голыми и не голыми репозиториями

Блог поможет вам понять это.https://www.atlassian.com/git/tutorials/setting-up-a-repository

0 голосов
/ 11 июля 2018

Вы можете выполнить следующие команды для инициализации вашего локального репозитория

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

Вы должны работать над своим проектом из локального хранилища и использовать сервер в качестве центрального хранилища.

Вы также можете следовать этой статье, которая объясняет каждый аспект создания и поддержки Git-репозитория. Git для начинающих

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...