Статьи

DZone Top Article 2011 года: 8 способов поделиться своим Git-репозиторием


Этот пост содержит краткую информацию о различных способах обмена репозиторием git.
В зависимости от ваших потребностей вы можете выбрать различные решения.

вместилище профессионал Против Контроль доступа Создать хранилища
Файловый ресурс Доступ к сети не требуется Не интернет Использование файловых разрешений Требуется подготовка по проекту на акцию
Git Daemon Быстрый git протокол Не интернет-порт нет хорошего контроля разрешений. Чтение по умолчанию, запись может быть включена, но только анонимно за проект должен быть благословлен
Простой SSH сервер Позволяет хорошую безопасность Не дружественный к интернету порт, требуется создание учетной записи для каждого пользователя на сервере Использует разрешения файла за начатый проект
SSH-сервер git-shell Улучшение сценария простого SSH-сервера Не дружественный к интернету порт, требуется создание учетной записи для каждого пользователя на сервере Использует разрешения файла за начатый проект
Gitosis Добавляет хорошее удаленное управление пользователями и репозиториями, требуется только одна системная учетная запись Не интернет-порт Использует файл gitosis-config Нет инициализации сервера, нужен только конфиг
Apache http Откат к стандартной конфигурации Apache, требуется только одна системная учетная запись, дружественный к Интернету Слегка над головой Использует htpasswd за начатый проект
Apache http + gitweb Откат к стандартной конфигурации Apache, требует только одну системную учетную запись, дружественный к Интернету, добавляет хороший вид на хранилище Слегка накладные расходы, доступ только для чтения Использует htpasswd за начатый проект
GitHub Доступ в Интернет, простой в использовании веб-интерфейс Размещено внешне Управление sshkeys веб интерфейс

http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#setting-up-a-public-repository

Подготовка: Git включить простой проект-X

Допустим, у вас есть проект с именем project-X, над которым вы работали, на вашей локальной машине. Он содержит один файл с именем README.

Чтобы включить git в этом проекте, вы можете:

$ cd $HOME/project-X


# git init enables the git repository
$ git init


# You add the readme file to the repository
$ git add README


# You commit your changed to your local repository
$ git commit -a -m 'Added README'

это даст вам каталог .git в каталоге project-X, готовый к использованию в этом руководстве

Поделитесь им по файлу

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

Допустим, у нас есть общий путь / share / git /, куда мы хотим поместить наш проект-X

Подготовка репозитория

# First we navigate to the repository place and will create a new project-X dir
$ cd /share/git
$ mkdir project-X	
$ cd project-X


# now we initialize this directory
# but instead of using git init, we use  git --bare init
# "A short aside about what git means by bare: A default git repository assumes that you will be using it as your working directory, 
# so git stores the actual bare repository files in a .git directory alongside all the project files. Remote repositories don't need 
# copies of the files on the filesystem unlike working copies, all they need are the deltas and binary what-nots of the repository itself. This is what "bare" means to git. Just the repository itself."
$ git --bare init

Перенос вашего локального репозитория в общий репозиторий

# First go to your local repository
$ cd $HOME/project-X
# Then make the link to the shared repository
$ git remote add origin file:///share/git/project-X


# We push to the remote repository
$ git push origin master

Управление доступом

Поскольку мы имеем дело с файловым ресурсом, разрешения обрабатываются разрешениями файловой системы. Вы можете создать две группы: project-X-read, project-X-write. Чтобы установить эти различные групповые разрешения, вы можете использовать:

Доступ к хранилищу

# Another user can now clone the repository using:
$ git clone file:///share/git/project-X
# Change something
$ ....
# Commit the changes
$ git commit -a
# Push the changes to the central repository
$ git push

Поделитесь с помощью git-daemon

Установка git-daemon

Git включает в себя простой демон, который вы используете для совместного использования проекта с использованием протокола git.

На Centos, Redhat для этого требуется другой пакет:

$ sudo yum install git-daemon

Более подробную информацию можно найти
http://www.kernel.org/pub/software/scm/git/docs/git-daemon.html.

# Start the git daemon
$ git daemon

Это создает сетевой приемник на порту GIT. По умолчанию он предоставляет доступ на чтение к git-проектам.

Подготовьте репозиторий

Чтобы позволить git-daemon читать ваш проект, вы должны добавить файл
.git / git-daemon-export-ok в ваш проект.

Управление доступом

Git daemon не имеет представления о пользователях. По умолчанию разрешено чтение для всех, если вы хотите предоставить доступ на запись, то вы должны разрешить его всем анонимно.

Это то, что делает менее подходящим для контроля доступа.

Если вы пытаетесь обновить, вы получаете следующие ошибки:

# On the local side
$ git push git://localhost/...
Initialized empty Git repository in ....
localhost[0: ::1]: errno=Connection refused
localhost[0: fe80::1]: errno=Connection refused
fatal: The remote end hung up unexpectedly


# On the git daemon side
Error on daemon side:
 [9027] 'receive-pack': service not enabled for git://localhost/...
..


Доступ к хранилищу

$ git clone git:localhost/<i>your-path</i>/project-X

Поделиться с помощью ssh сервера

Совместное использование через ssh похоже на совместное использование через файловую систему.

Подготовка репозитория

# On the SSH server we assume var/git as the central repository place and will create a new project-X dir
$ cd /var/git
$ mkdir project-X       
$ cd project-X


# now we initialize this directory
# but instead of using git init, we use  git --bare init
# "A short aside about what git means by bare: A default git repository assumes that you will be using it as your working directory
# , so git stores the actual bare repository files in a .git directory alongside all the project files. Remote repositories don't need copies of the
 files on the filesystem unlike working copies, all they need are the deltas and binary what-nots of the repository itself. This is what "bare" means to git. Just the repository itself."
$ git --bare init

Перенос вашего локального репозитория в общий репозиторий

# First go to your local repository
$ cd $HOME/project-X
# Then make the link to the shared repository
$ git remote add origin ssh://user@gitserver/var/git/project-X


# We push to the remote repository
$ git push origin master

Управление доступом

Чтобы иметь доступ, все пользователи должны иметь учетную запись на сервере ssh. Так что это означает добавление пользователя для каждого пользователя.

Разрешения обрабатываются разрешениями файловой системы. Вы можете создать две группы: project-X-read, project-X-write.

Чтобы установить эти различные групповые разрешения, вы можете использовать:

Доступ к хранилищу

# Another user can now clone the repository using:
$ git clone file:///share/git/project-X
# Change something
$ ....
# Commit the changes
$ git commit -a
# Push the changes to the central repository
$ git push

Поделитесь с помощью git-daemon

Запуск демона

Git включает в себя простой демон, который вы используете для совместного использования проекта с использованием протокола git.

Более подробную информацию можно найти http://www.kernel.org/pub/software/scm/git/docs/git-daemon.html.

# Start the git daemon
$ git daemon

Это создает сетевой приемник на порту GIT. По умолчанию он предоставляет доступ на чтение к git-проектам.

Подготовьте репозиторий

Чтобы позволить git-daemon читать ваш проект, вы должны добавить файл
.git / git-daemon-export-ok в ваш проект.

Управление доступом

Git daemon не имеет представления о пользователях. По умолчанию разрешено чтение для всех, если вы хотите предоставить доступ на запись, то вы должны разрешить его всем анонимно.

Это то, что делает менее подходящим для контроля доступа.

Если вы пытаетесь обновить, вы получаете следующие ошибки:

# On the local side
$ git push git://localhost/...
Initialized empty Git repository in ....
localhost[0: ::1]: errno=Connection refused
localhost[0: fe80::1]: errno=Connection refused
fatal: The remote end hung up unexpectedly


# On the git daemon side
Error on daemon side:
 [9027] 'receive-pack': service not enabled for git://localhost/...
..


Доступ к хранилищу

$ git clone git:localhost/your-path/project-X

Поделиться с помощью ssh сервера

Совместное использование через ssh похоже на совместное использование через файловую систему.

Подготовка репозитория

# On the SSH server we assume var/git as the central repository place and will create a new project-X dir
$ cd /var/git
$ mkdir project-X       
$ cd project-X


# now we initialize this directory
# but instead of using git init, we use  git --bare init
# "A short aside about what git means by bare: A default git repository assumes that you will be using it as your working directory
# , so git stores the actual bare repository files in a .git directory alongside all the project files. Remote repositories don't need copies of the
 files on the filesystem unlike working copies, all they need are the deltas and binary what-nots of the repository itself. This is what "bare" means to git. Just the repository itself."
$ git --bare init

Перенос вашего локального репозитория в общий репозиторий

# First go to your local repository
$ cd $HOME/project-X
# Then make the link to the shared repository
$ git remote add origin ssh://user@gitserver/var/git/project-X


# We push to the remote repository
$ git push origin master

Управление доступом

Чтобы иметь доступ, все пользователи должны иметь учетную запись на сервере ssh. Так что это означает добавление пользователя для каждого пользователя.

Разрешения обрабатываются разрешениями файловой системы. Вы можете создать две группы: project-X-read, project-X-write.

Чтобы установить эти разные групповые разрешения, вы должны использовать set. Чтобы установить эти разные групповые разрешения, вы должны использовать команду setfacl в linux или chmod + a в MacOSX.

Конечно, вы можете иметь несколько ключей для одной учетной записи, но это не позволит вам Различать разные права

Доступ к хранилищу

# Another user can now clone the repository using:
$ git clone ssh://user@gitserver/var/git/project-X
# Change something
$ ....
# Commit the changes
$ git commit -a
# Push the changes to the central repository
$ git push

Поделитесь с помощью git-shell

Аналогично
настройке репозитория SSH . Единственное отличие состоит в том, что вместо того, чтобы давать каждому пользователю нормальную оболочку fi ‘/ bin / login’, вы устанавливаете ‘/ usr / bin / git-shell’ в качестве более строгой оболочки, которая допускает только команды git.

Доступ к нему любым другим способом приведет к забавному сообщению:

 fatal: What do you think I am? A shell?

Поделиться с помощью Gitosis

Gitosis позволяет вам иметь учетную запись на сервере ssh и передавать все коммиты через эту учетную запись.

Установка гитоза

# On Centos,Redhat to install gitosis
$ sudo yum install gitosis


# This creates /var/lib/gitosis
# This creates a user gitosis with as default homedir /var/lib/gitosis
$ grep gitosis /etc/passwd
gitosis:x:100:101:git repository hosting:/var/lib/gitosis:/bin/sh

Инициализация gitosis

Чтобы инициализировать gitosis, он должен иметь открытый ключ (id_dsa.pub) пользователя, который будет первым администратором.

# Для инициализации учетной записи gitosis $ sudo -H -u gitosis gitosis-init </ tmp / id_dsa. pub Инициализированный пустой Git-репозиторий в ./ Повторно инициализировать существующий Git-репозиторий в ./ **

В результате создается следующая структура:

.
|-- .gitosis.conf -
/var/lib/gitosis/repositories/gitosis-admin.git/gitosis.conf
|-- .ssh
|   `-- authorized_keys
|-- gitosis
|   `-- projects.list
`-- repositories
    `-- gitosis-admin.git
        |-- HEAD
        |-- branches
        |-- config
        |-- description
        |-- gitosis-export
        |   `-- keydir
        |       `-- myself@my-Portable.local.pub
        |-- gitosis.conf
        |-- hooks
        |   |-- applypatch-msg
        |   |-- commit-msg
        |   |-- post-commit
        |   |-- post-receive
        |   |-- post-update
        |   |-- pre-applypatch
        |   |-- pre-commit
        |   |-- pre-rebase
        |   |-- prepare-commit-msg
        |   `-- update
        |-- index
        |-- info
        |   `-- exclude
        |-- objects
        |   |-- info
        |   `-- pack
        |       |-- pack-82e64648d14e24258fa7c569100c6805edfc314c.idx
        |       `-- pack-82e64648d14e24258fa7c569100c6805edfc314c.pack
        `-- refs
            |-- heads
            |   `-- master
            `-- tags
15 directories, 23 files

Помимо этой структуры каталогов, gitosis-init также добавляет ключ для авторизованных ключей пользователя gitosis.

Он не разрешает интерактивный вход в систему и ограничивает команды командой gitosis-server.

$ sudo -H -u gitosis cat $HOME/.ssh/authorized_keys
### autogenerated by gitosis, DO NOT EDIT
command="gitosis-serve myself@my-Portable.local",no-port-forwarding ,no-X11-forwarding,no-agent-forwarding,no-pty ssh-dss AAAAB3NzaC1kc3MAAACBAMAgxc ....

Чтобы правильно обрабатывать обновления Gitosis, мы должны сделать исполняемый файл после обновления

sudo chmod 755 /var/lib/gitosis/repositories/gitosis-admin.git/hooks/post-update

Управление доступом

Прежде чем вы сможете отправить локальный репозиторий в Gitosis, вы должны настроить правильные разрешения

# Checkout the gitosis-admin repository (using the public key you used to gitosis-init
$ mkdir gitosis
$ git clone ssh://gitosis@gitosis-server:gitosis-admin.git
# And two groups to the gitosis-conf
   [group project-X-read]
   members = usera, userb
   readable = project-X


   [group project-X-write]
   members = userc, userd
   writable = project-X


# Copy the public keys of usera,userb, userc, userd into the  keydir, with the correct names
        |-- gitosis-export
        |   `-- keydir
        |       `-- myself@my-Portable.local.pub
        |           usersa.pub
        |           usersb.pub
        |           usersc.pub
        |           usersd.pub
        |-- gitosis.conf
# Add the keys
$ git add gitosis-export/keydir/*.pub
$ git commit -a -m 'Added users'
# push them back to the repository
$ git push

Перенос вашего локального репо на сервер gitosis

$ cd project-X
$ git remote add origin gitosis@gitosis-server:project-X.git
$ git push origin master:refs/heads/master

Это создаст каталог project-X в / var / lib / gitosis / repositories /

Доступ к хранилищу Ничего особенного здесь нет. Если ваш ключ был добавлен в репозиторий gitosis-admin, вы можете получить к нему доступ.

$ git clone gitosis@gitosis-server:project-X.git

Поделитесь через apache http

Подготовка репозитория

# On the web server we assume var/git as the central repository place and will create a new project-X dir
$ cd /var/git
$ mkdir project-X
$ cd project-X


# now we initialize this directory
# but instead of using git init, we use  git --bare init
# "A short aside about what git means by bare: A default git repository assumes that you will be using it as your working directory
# , so git stores the actual bare repository files in a .git directory alongside all the project files. Remote repositories don't need copies of the
 files on the filesystem unlike working copies, all they need are the deltas and binary what-nots of the repository itself. This is what "bare" means to git. Just the repository itself."
$ git --bare init

Теперь, когда мы создали каталог проекта, нам нужно предоставить ему доступ apache:

  • Обязательно установите правильные разрешения для каталога / var / git, чтобы он мог быть прочитан веб-пользователем. chown -R apache: apache / var / git / project-X
  • Если у вас включен selinux: chcon -R -t httpd_sys_content_t / var / git / project-X
  • Включите перехват после обновления: chmod + x / var / git / project-X / hooks / post-update

Когда вы не установили сообщение commithook:

$ git clone http://git.yourdomain.com/project-X
Initialized empty Git repository in /Users/mydir/project-X/.git/
fatal: http://git.yourdomain.com/project-X.git/info/refs not found: did you run git update-server-info on the server?

Тогда вам может понадобиться запустить его вручную в первый раз

$ cd /var/git/project-X
$ sudo -u apache git update-server-info

Подготовка apache В

этом документе предполагается, что у вас есть базовая настройка apache. И у вас работает виртуальный сервер имен. Большая часть стандартного доступа к каталогу.

Чтобы разрешить доступ для записи, нам нужно включить Webdav.

http://www.kernel.org/pub/software/scm/git/docs/howto/setup-git-server-over-http.txt

<VirtualHost some-ip:80>
	Servername git.mydomain.com
	DocumentRoot /var/git
	<Directory "/var/git">
	   <b>DAV On</b>
	   Options +Indexes +FollowSymLinks 
		AllowOverride None
		Allow from all
		Order allow,deny
	</Directory>
</VirtualHost>

Это добавит виртуальный сервер, который имеет доступ к каталогу / var / git с помощью простого просмотра.

Если у вас возникли проблемы:

  • Снимите ограничения с welcome.conf: в этом файле по умолчанию он отключает опцию индекса. Ошибка: …
  • Обратите внимание на + перед параметрами, чтобы разрешить объединение разрешений

Контроль доступа

Мы контролируем доступ к вашему хранилищу, используя файлы групп Apache и файлы паролей.

<VirtualHost YOUR-IP:80>
	ServerName git.yourdomain.com
	DocumentRoot /var/git
	<Directory /var/git/>
		DAV On
		Options ExecCGI FollowSymLinks Indexes
		# Deny everyything here
		<b>Deny from all
		AuthType Basic
		AuthName "git repository"
		AuthUserFile /var/git/htpasswd.git
		AuthGroupFile /var/git/htgroup.git</b>
	</Directory>


	<b><Directory /var/git/project-X>
		Allow from all
		Order allow,deny
		<Limit GET>
			Require group project-X-read
		</Limit>
		<Limit GET PUT POST DELETE PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
			Require group project-X-write
		</Limit>
		</Directory></b>
</VirtualHost>


Доступ к хранилищу

Git использует curl для доступа к хранилищам http. Поскольку наш репозиторий теперь защищен, нам нужно создать запись в нашем файле $ HOME / .netrc

$ cat $HOME/.netrc
machine git.yourdomain.com
login reader
password reader

Теперь вы должны быть в состоянии клонировать Project-X

$ git clone http://git.mydomain.com/project-X

Возможные ошибки

Trying update
error: Cannot access URL http://git.yourdomain.com/project-X/, return code 22
error: failed to push some refs to 'http://git.yourdomain.com/project-X'

Если что-то не так с разрешениями. Возможно, у вас не включен webdav, пользователь не в той группе или неправильно заданы разрешения для файлов. Проверьте ваш apache error_log

$ git clone http://git.yourdomain.com/project-X
$ git push
fatal: git-push is not available for http/https repository when not compiled with USE_CURL_MULTIerror: failed to push some refs to 'http://git.yourdomain.com/project-X'

Либо вы компилируете свой git-клиент с правильными параметрами curl. Или же вы можете смонтировать удаленный репозиторий как общий ресурс webdav и получить к нему доступ через file: // reference. Смотрите
http://wiki.dreamhost.com/Talk:Git

The following happens if your curl library  was not compiled with the correct options to post to 
<a href="http://kerneltrap.org/mailarchive/git/2008/1/13/564431">http://kerneltrap.org/mailarchive/git/2008/1/13/564431</a>
After a bit of research it seems that CURL compilation into GIT was not entirely successful for the Git on Mac OS X. As I was already mounting the git repository via WebDAV you an push and pull to your locally mounted repository by replacing the http URL with the path to your mounted WebDAV (/Volumes//). This worked pretty well for me and works well with Dreamhost with very little configuration.
$ git push
Fetching remote heads...
   refs/
   refs/tags/
   refs/heads/
   No refs in common and none specified; doing nothing.

Это происходит, когда вы клонировали пустой репозиторий:

Поскольку вы клонировали пустой репозиторий, вам нужно указать источник и мастер, после этого первого нажатия вы можете использовать git push как обычно

$ git push origin master

Совместное использование репозитория с использованием apache и gitweb

По умолчанию Apache не обеспечивает дружественный просмотр хранилища. Чтобы улучшить веб-интерфейс, вы можете использовать git-web. Это скрипт на питоне.

Прежде чем использовать эту опцию, сначала настройте простой apache http. Это позволяет вам лучше проверить, в чем проблема.

Установка gitweb

# Easy gitweb installation on Centos,Redhat, which installs itself in /var/www/git by default
$ yum install gitweb
# You have to manually create a /etc/gitweb.conf file
   $GIT= "/usr/bin/git";
   $projectroot = "/var/git/";

Gitweb предоставляет приятный интерфейс, но если вы захотите взять на себя управление вашим веб-рендерингом, git будет сбит с толку.

Чтобы решить эту проблему, мы разрешаем разные способы доступа к одному и тому же хранилищу:

  • Используя http://git.yourdomain.com/project-X.git: используя AliasMatch, мы можем сопоставить это с традиционной обработкой индекса
  • С http://git.yourdomain.com/project-X: это покажет интерфейс gitweb
<VirtualHost YOUR-IP:80>
	<b>SetEnv GITWEB_CONFIG /etc/gitweb.conf</b>
	ServerName git.yourdomain.com
	<b>DocumentRoot /var/www/git</b>
	<b>AliasMatch ^(/.*?)(\.git)(/.*)? /var/git$1$3</b>
	<Directory /var/git/>
		DAV On
		Options ExecCGI FollowSymLinks Indexes
		# Deny everyything here
		Deny from all
		AuthType Basic
		AuthName "git repository"
		AuthUserFile /var/git/htpasswd.git
		AuthGroupFile /var/git/htgroup.git
	</Directory>


	<Directory /var/git/project-X>
		Allow from all
		Order allow,deny
		<Limit GET>
			Require group project-X-read
		</Limit>
		<Limit GET PUT POST DELETE PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
			Require group project-X-write
		</Limit>
		</Directory>


	<b>
	<Directory /var/www/git>
		Options ExecCGI FollowSymLinks Indexes
		Allow from all
		Order allow,deny
		AddHandler cgi-script cgi
		DirectoryIndex gitweb.cgi
		RewriteEngine on
		RewriteCond %{REQUEST_FILENAME} !-f
		RewriteRule ^.* /gitweb.cgi/$0 [L,PT]
	</Directory>
	</b>
</VirtualHost>

Управление доступом

Аналогично
хранилищу Apache http

Публикация локального хранилища

Аналогично
хранилищу
Apache http, но теперь вам нужно использовать расширение .git

$ git clone http://git.yourdomain.com/project-X.git

Очень распространенная ошибка

$ git push
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
fatal: The remote end hung up unexpectedly
error: failed to push some refs to 'file:///share/projects/project-X'

Если вы прошли через шаги git remote add origin …., вы могли бы подумать, что git будет достаточно умен, чтобы теперь git push должен перейти к вашему источнику.

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

	$ git push origin master

Другой способ решить эту проблему — добавить следующие строки в ваш файл .git / config.

$ vi .git/config
        [branch "master"]
        remote = origin
        merge = refs/heads/master

Или еще один способ — указать параметр при добавлении удаленного
http://swedishcampground.com/adding-a-remote-to-existing-git-repo

        
$ git remote add --track master origin file:///share/projects/project-X