1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

How to setup a Git repository

Discussion in 'Howtos and FAQs (Moderated)' started by dennylin93, Jan 30, 2010.

  1. dennylin93

    dennylin93 New Member

    Messages:
    784
    Thanks Received:
    104
    This howto will describe how to setup a Git repository:
    • Dedicated user for Git repos
    • SSH will be used for commits
    • Enable gitweb for web access (Apache will be used)
    • Anonymous cloning using the Git protocol

    For those who don't know what Git is:

    You should know how to use Git before reading on.

    Install devel/git. Select GITWEB. SVN, P4, and CVS are optional. Deselect them if you don't plan to use them.

    Create a git user with uid and gid as 9418:
    Code:
    # pw groupadd -n git -g 9418
    # pw useradd -n git -u 9418 -g git -c git -d /git \
    	-s /usr/local/libexec/git-core/git-shell -h -
    


    The git-shell is used for this user, and home is set as /git/. The repos will be under /git/base/.

    Make sure the permissions of the directory are correct and create /git/base/:
    Code:
    # chown git:git /git/
    # chmod 755 /git
    # mkdir /git/base/
    # chown git:git /git/base/
    # chmod 775 /git/base/
    


    Next, add users to the git group to be able to create repositories under /git/base/. This isn't necessary for users who only need commit access.
    Code:
    # vi /etc/group
    ...
    git:*:9418:user1,user2
    


    We'll be using SSH keys for authenication, so collect the public keys of all the users who need commit access. Then, put the public keys into the right place:
    Code:
    # mkdir /git/.ssh/
    # chmod 700 /git/.ssh/
    # touch /git/.ssh/authorized_keys
    # chmod 600 /git/.ssh/authorized_keys
    (Put the public keys into authorized_keys, one per line)
    # chown -R git:git /git/.ssh/
    


    Everything should be set now. Let's create a repo for testing (change to a user that has been added to the git group and has commit access).
    Code:
    $ mkdir /git/base/test.git
    $ cd /git/base/test.git && git init --bare --shared
    


    Create a local repo and commit:
    Code:
    $ mkdir ~/test
    $ cd ~/test && git init
    $ echo '123456' > foo
    $ git add .
    $ git commit
    


    Now push it into the remote repo (remember to replace git.example.com with your own hostname):
    Code:
    $ git remote add origin git@git.example.com:base/test.git
    $ git push origin master
    


    Don't delete the test repo yet.

    Since the git repo should be up and working by now, let's enable gitweb for web access. Apache's VirtualHost will be used for this.

    Copy gitweb files to /home/www/git/:
    Code:
    $ cp /usr/local/share/examples/git/gitweb/git* /home/www/git/
    


    Modify Apache settings (change the ServerName and the access and error log paths as necessary):
    Code:
    <VirtualHost *:80>
      ServerAdmin webmaster@yourhostname
      DocumentRoot "/home/www/git"
      ServerName git.example.com
      ErrorLog "/path/to/errolog"
      CustomLog "/path/to/accesslog" combined
    
      <Directory "/home/www/git">
        Options ExecCGI
        Order allow,deny
        Allow from all
    
        DirectoryIndex gitweb.cgi
        AddHandler cgi-script .cgi
      </Directory>
    </VirtualHost>
    


    Now edit gitweb.cgi:
    Code:
    -our $projectroot = "/pub/scm";
    +our $projectroot = "/git/base";
    ...
    -our $home_link_str = "projects";
    +our $home_link_str = "base";
    ...
    -our $site_name = ""
    +our $site_name = "git.example.com"
    ...
    -our $home_text = "indextext.html";
    +our $home_text = "content.html"; (Leave empty if unnecessary)
    ...
    -our $projects_list_description_width = 25;
    +our $projects_list_description_width = 40; (Give the description a bit more space)
    


    Change the $site_header, $home_text, and $site_footer as needed.

    Open up your browser and check if it's working.

    You might notice that the description of the test repo hasn't been modified yet. You might also want to change the owner.

    For the description, edit /git/base/test.git/description. Put this into /git/base/test.git/config to change the owner:
    Code:
    [gitweb]
            owner = Your Name
    


    Only the Git protocol isn't working now.

    Add this to /etc/rc.conf:
    Code:
    git_daemon_enable="YES"
    git_daemon_directory="/git"
    git_daemon_flags="--syslog --base-path=/git --export-all"
    


    Start the daemon:
    Code:
    # /usr/local/etc/rc.d/git_daemon start
    


    You should now be able to clone using the Git protocol. Try it out:
    Code:
    $ cd /tmp/
    $ git clone git://git.example.com/base/test.git
    


    One last thing. You might want to list URLs for cloning repos on the summary page of test.git in gitweb. Just add this line (the url line) to the [gitweb] section of /git/base/test.git/config:
    Code:
    [gitweb]
            owner = Your Name
            url = git://git.example.com/base/test.git
    


    This line can appear more than once if there are multiple URLs:
    Code:
    [gitweb]
            owner = Your Name
            url = git://git.example.com/base/test.git
            url = git@git.example.com:base/test.git
    
     
    Daren, jnbek, blaize and 13 others thank for this.
  2. VictorGT

    VictorGT New Member

    Messages:
    1
    Thanks Received:
    1
    Thanks a lot for this useful article!

    I've noticed one problem on my FreeBSD 7.2 - looks like it is better to add one more flag (--detach) to the rc.conf:
    Code:
    git_daemon_flags="--syslog --base-path=/git --export-all --detach"
     
    blodan thanks for this.
  3. graudeejs

    graudeejs Well-Known Member

    Messages:
    4,594
    Thanks Received:
    633
    You can use devel/py-gitosis to manage git users.
    This way system only needs 1 git user. Other users will be virtual users (authorization with ssh public/private keys)

    It is very nice peace of software...
    I use gitosis & cgit at git.bsdroot.lv
     
    draco003 thanks for this.
  4. blaize

    blaize New Member

    Messages:
    22
    Thanks Received:
    3
    I have the same problem on FreeBSD 9, if you don't add --detach in rc.conf, the daemon is started in the foreground and the boot process is stuck at launching the daemon (before SSH :/)

    Except that, everything works very well ! Thank you.
     
    blodan thanks for this.