Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Private git repository over http

Tags:

git

http

can you recommend any no-brainer solution for setting up a git repository accessible via http(s, has cleutus suggested)? I have my own http server and I'd like to use it to host some minor private project. At home I can ssh it, but at work firewalls keep me from doing so.

Is there any free way to set up a small private git repository I can push / fetch to via http so that I can share projects between home and work? Thanks in advance!

like image 844
pistacchio Avatar asked Feb 17 '10 07:02

pistacchio


People also ask

Can I have a private Git repository?

When you create a repository, you can choose to make the repository public or private. Repositories in organizations that use GitHub Enterprise Cloud and are owned by an enterprise account can also be created with internal visibility. For more information, see the GitHub Enterprise Cloud documentation.

How can I share a private GitHub repository via link?

On GitHub.com, navigate to the main page of the repository. Under your repository name, click Settings. In the "Access" section of the sidebar, click Collaborators & teams. Click Invite a collaborator.

Is Git over HTTP?

Git can communicate over HTTP using two different modes. Prior to Git 1.6. 6, there was only one way it could do this which was very simple and generally read-only. In version 1.6.

How do I access a private GitHub repository?

Set up a GitHub SSH key. Add the public SSH key to a private repository's deploy keys. Store the private SSH key in Secret Manager. Submit a build that accesses the key from Secret Manager and uses it to access the private repository.


2 Answers

Git supports this natively. You'll need an HTTP server, of course.

Put your (bare) repository in a folder that can be accessed by your web server. In that directory, run the following commands:

$ git --bare update-server-info
$ mv hooks/post-update.sample hooks/post-update

The first command provides extra information so the web server knows what to do with the repository. The second command makes sure that the information gets updated any time someone pushes to the repository.

You can find that information here: http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#setting-up-a-public-repository

like image 126
Steve Nay Avatar answered Oct 03 '22 02:10

Steve Nay


webDAV is not required

And what is more, DAV is significantly slower than the new "smart-http" support since git 1.6.6. The new method allows the entire pack to be transmitted at once, and not as individual files.


You can also use gitweb to provide browsable URLs at the same location.

Note: Because access is controlled by apache you can add any Auth requirements (htaccess or ldap, etc) to the setup for each repository.


Just make a new git_support.conf file, and include it in apache (add include statement in httpd.conf)

#
#  Basic setup for git-http-backend
#

SetEnv GIT_PROJECT_ROOT /opt/git_repos
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER  #IMportant !!! This could be your problem if missing

<Directory /opt/git>  # both http_backend and gitweb should be somewhere under here
        AllowOverride None
        Options +ExecCGI -Includes  #Important! Lets apache execute the script!
        Order allow,deny
        Allow from all
</Directory>

# This pattern matches git operations and passes them to http-backend
ScriptAliasMatch \
        "(?x)^/git/(.*/(HEAD | \
                        info/refs | \
                        objects/(info/[^/]+ | \
                                 [0-9a-f]{2}/[0-9a-f]{38} | \
                                 pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
                        git-(upload|receive)-pack))$" \
        /opt/git/libexec/git-core/git-http-backend/$1

# Anything not matched above goes to displayable gitweb interface
ScriptAlias /git /opt/git/cgi-bin/gitweb.cgi/

The result is the ability to push/pull:

me@machine /tmp/eddies $ git pull
Already up-to-date.

me@machine /tmp/eddies $ touch changedFile

me@machine /tmp/eddies $ git add .

me@machine /tmp/eddies $ git commit -am"commiting change"
[master ca7f6ed] commiting change
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 changedFile

me@machine /tmp/eddies $ git push origin master
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 239 bytes, done.
Total 2 (delta 1), reused 0 (delta 0)
To http://mysecretdomain.com/git/eddies
   0f626a9..ca7f6ed  master -> master

And you can browse those changes online.. gitweb provides a browsable interface

Source: http://repo.or.cz/w/alt-git.git?a=blob_plain;f=gitweb/README

like image 44
Eddie Avatar answered Oct 03 '22 00:10

Eddie