Git: Anonymous Access Under Windows

On March 14, 2010, in Uncategorized, by derekgreer

The Git version control system provides a simple protocol for sharing Git repositories anonymously over a TCP port. This can be useful for providing read-only access to a repository, or for facilitating pull-based collaboration within teams. The following is a guide for setting up and sharing a Git repository anonymously under Windows using Cygwin.

Step 1: Install Cygwin with the cygrunsrv and desired git packages:

Step 2: Create a file named gitd in the /usr/sbin directory with the following content:


git daemon --reuseaddr --base-path=/cygdrive/c/Projects


By default, the git daemon only shares folders under the base path which contain a file named git-daemon-export-ok. If you wish to share all folders under the base path without requiring this file, use the switch --export-all.

This command assumes the base path of all shared git repositories will be /cygdrive/c/Projects/ (i.e. C:Projects under Windows). Change this value if your projects are stored in an alternate location.

If you wish to enable anonymous push access to your repositories (not advisable), you can add the switch --enable=receive-pack.

Step 3: From a bash shell prompt, run the following cygrunsrv command to install the script as a service (Note: This command assumes Cygwin is installed at C:Cygwin):

cygrunsrv   --install gitd                        
            --path c:/cygwin/bin/bash.exe         
            --args c:/cygwin/usr/sbin/gitd        
            --desc "Git Daemon"                   

Step 4: From a bash shell prompt, run the following command to start the service:

cygrunsrv --start gitd

The gitd service should now be running. To verify that everything is setup properly, here is a quick and dirty script which should establish that the desired repositories are remotely accessible:



echo "Creating a local git repo ..."
mkdir -p ${REPO_PATH}
git init
touch .git/git-daemon-export-ok
echo "Commiting test file ..."
touch testfile
git add -A
git commit -m 'Test message'

echo "Simulate remote clone ..."
mkdir ${REMOTE_PATH}
git clone git://localhost/${REPO_NAME}

echo "Cleaning up test folders ..."
rm -rf ${REPO_PATH}
rm -rf ${REMOTE_PATH}
Tagged with: