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

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

Я создал голый репозиторий (на моем сервере Git, машина 2) с:

$ mkdir test_repo
$ git --bare init

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

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

Правильный способ иметь центральный репозиторий с открытым репозиторием?

Я немного смущен этой темой. Пожалуйста, дайте мне понять это.

Ответ 1

Во-первых, просто чтобы проверить, вам нужно перейти в каталог, который вы создали, перед запуском 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, do

git config receive.denyCurrentBranch ignore

=== community edit ===

git init --bare --shared=group

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Чтобы иметь центральный репозиторий, единственный способ иметь репозиторий bare.

Ответ 4

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

git init --bare test_repo.git

Ответ 5

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

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

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

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

git remote add central <url> # url will be ssh based for you
git push --all central

Ответ 6

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

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

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

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

Ответ 7

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

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

$ cd test_repo
$ git log --relative=/

Это покажет вам совершенные изменения, как если бы это было регулярное репо git.

Ответ 8

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

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

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

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

Ответ 9

На основе Mark Longair и Roboprog ответы:

, если git версия > 1.7

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

Или:

, если git version < 1,8

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