Как вы используете репозиторий «git --bare init»?

321

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

Я создал пустой репозиторий (на моем git-сервере, машина 2) с:

$ mkdir test_repo
$ git --bare init

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

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

Правильный ли способ иметь центральное хранилище, чтобы иметь голое хранилище?

Я немного запутался с этим предметом. Пожалуйста, дайте мне ключ к этому.

Андре
источник

Ответы:

392

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

git init --bare test_repo.git

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

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, это то, что вы хотите, если вы делаете это на работе, а не для проекта частного дома.

Марк Лонгэйр
источник
7
Вы также можете добавить --sharedопцию, initесли вы планируете, чтобы другие люди подталкивали к этому репо. Он автоматически добавляет групповые разрешения на запись в хранилище - ссылка
prasanthv
17
Я думаю, что эти три строки имеют тот же эффект, что и эта: git --bare init test_repo.git По крайней мере с моей текущей версией git (1.8.2.2)
Fran Marzoa
1
полезно, если вы хотите узнать разницу между голыми и не голыми репозиториями stackoverflow.com/questions/7861184/…
Guille Acosta
как Git находит вещи, если не работает дерево? я думал, что в хранилище объектов git есть рабочее дерево, и именно на это указывают промежуточные SHA и коммиты
akantoword
@akantoword: git хранит всю информацию о коммитах и ​​ветках где-нибудь. Фиксация - это, скорее всего, разница между предыдущей версией файлов и новой версией. Рабочее дерево - это просто снимок его реального содержимого в определенный момент времени. В любом случае, с рабочим деревом вы можете перемещаться между коммитами и ветвями. Вы даже можете оформить заказ на другом рабочем дереве, если хотите.
user276648
246

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

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

Далее нам нужно создать рабочую папку. Есть несколько способов сделать это, в зависимости от того, есть ли у вас файлы.

2а. Создайте новую рабочую папку (без существующих файлов), клонируя пустое хранилище.

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

На данный момент у нас есть наш первый коммит и локальная ветка master, которую нам нужно превратить в ветвь ветки с удаленным отслеживанием.

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

Адельф Мецский
источник
4
Интересный. Конечно, более подробный, чем мой ответ. +1
VonC
13
Этот ответ решит мою проблему и должен быть принят, надеюсь, все больше и больше людей смогут проголосовать за него.
Inix
11
Вы должны брать деньги за такие ответы
Артур Тарасов
2
Как новый пользователь git, этот ответ был невероятно полезным для меня, спасибо за написание этого!
sidewinderguy
1
Это блестящий ответ. Очень поможет наш аппарат.
Вобсориано
33

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

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

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

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

Марцин Гил
источник
22

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

git init --bare test_repo.git
Серж С.
источник
20

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

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

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

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

git remote add central <url> # url will be ssh based for you
git push --all central
manojlds
источник
Использование git remote add central <url>, в случае SSH будет ли это включать путь тоже? напр.git remote add central ssh://user@server/home/user/repo.git
Да, Барри,
17

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

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

Для получения более подробной информации смотрите « GIT: Как мне обновить мой репо? ».
Ноты:

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

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

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

$ cd test_repo
$ git log --relative=/

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

Рассел
источник
5

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

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

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

Или :

если git версия <1.8

mkdir .git
cd .git
git init --bare --shared=group 
git config receive.denyCurrentBranch ignore
Разъем'
источник
Эта команда config: как она в итоге применяется к только что созданному каталогу .git?
GreenAsJade
Я не уверен, что понимаю ваш вопрос? Вы можете быть более точным? Поскольку у вас инициализирован репозиторий git, вы можете настроить его так, как вам нужно, с помощью команды 'git config' ..
Джек
@GreenAsJade Это потому, что вы все еще находитесь в папке репозитория git, так что это относится к этому (по умолчанию конфигурация git похожа на опцию --local).
BlueCoder
2

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

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

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

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

Цзе Чжан
источник
0

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

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 для начинающих

Самир Ранджан
источник