2011-10-03 2 views
231

мне нужно создать центральный репозиторий, но я немного запутался ...Как вы используете репозиторий git -bare init?

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

$ mkdir test_repo 
$ git --bare init 

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

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

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

Я немного смущен этой темой. Пожалуйста, дайте мне ключ к этому.

ответ

298

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

+5

Вы также можете добавить опцию '--shared' для' init', если вы планируете использовать другие люди для этого репо. Он автоматически добавляет права на запись группы в репозиторий - [link] (http://git-scm.com/book/en/Git-on-the-Server-Getting-Git-on-a-Server) – prasanthv

+14

Я думаю, что эти три линии имеют один и тот же эффект, чем это только один: мерзавец --bare INIT test_repo.git по крайней мере, с моей текущей версии мерзавца (1.8.2.2) –

+1

@Fran Не хорошо для 1,7 * версия кажется:. \ – deepdive

17

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

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

Смотреть подробнее "GIT: How do I update my bare repo?".
Примечание:

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

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

Голые хранилище является тот, который не имеет не работает дерево. Это означает, что все его содержимое есть в каталоге .git.

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

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

20

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

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

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

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

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

Использование 'git remote add central ', в случае SSH это включит и путь? например 'git remote add central ssh: // user @ server/home/user/repo.git' –

5

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

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

$ cd test_repo 
$ git log --relative=/ 

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

20

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

git init --bare test_repo.git 
151

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

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

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

+1

Интересно. Конечно, более подробный, чем мой ответ. +1 – VonC

+7

Этот ответ решает мою проблему и должен быть признанным ответом, надеемся, что все больше и больше людей смогут его проголосовать. – inix

+0

спасибо за этот полезный ответ –

1

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

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

Как местное хранилище в машине 1, так и хранилище «копия» в машине 2 не являются голыми. relationship between bare and non-bare repositories

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

0

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

если мерзавец версия> = 1,8

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

Или:

если мерзавец версия < 1,8

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

Эта команда config: как она в конечном итоге применяется к только что созданному каталогу .git? – GreenAsJade

+0

Я не уверен, что понимаю ваш вопрос? Вы можете уточнить? Поскольку у вас есть инициализированный репозиторий git, вы можете настроить его столько, сколько хотите, с помощью команды git config. – Jack

Смежные вопросы