git-server
Status
Description
git-server
serves a hierarchy of local Git repositories to Git clients accessing the repository over http://
and https://
protocol.
git-server
expects the local Git repositories (either cloned or created with git init
) to be organized as follows in the local file system:
<repos_root_dir>/
├── <owner_1>/
│ └── <repo_1>
│ └── <repo_2>
├── <owner_2>/
│ └── <repo_1>
│ └── <repo_2>
Alternatively, a virtual repository mapping allows to 'mount' repositories independent of their location in the file system into a <owner>/<repo>
hierarchy. A configuration example:
virtualRepos: {
owner1: {
repo1: {
path: './repo1',
},
},
owner2: {
repo2: {
path: '/repos/repo2',
},
},
},
Repositories exposed via git-server
can be used just like any repository hosted on GitHub,
i.e. you can clone them and push changes to.
The repository contents can be accessed with the same url patterns you would use to request files managed on GitHub.
The following protocols and APIs are currently supported:
Installation
cd <checkout dir>
npm install
Getting started
git-server
is configured via the config.js
file which is expected to exist in the current working directory. Here's the default configuration:
{
appTitle: 'Helix Git Server',
repoRoot: './repos',
// repository mapping. allows to 'mount' repositories outside the 'repoRoot' structure.
virtualRepos: {
demoOwner: {
demoRepo: {
path: './virtual/example',
},
},
},
listen: {
http: {
port: 5000,
host: '0.0.0.0',
},
/*
// https is optional
https: {
// cert: if no file is specfied a selfsigned certificate will be generated on-the-fly
// cert: './localhost.crt',
// key: if no file is specfied a key will be generated on-the-fly
// key: './localhost.key',
port: 5443,
host: '0.0.0.0',
},
*/
},
subdomainMapping: {
// if enabled, <subdomain>.<baseDomain>/foo/bar/baz will be
// resolved/mapped to 127.0.0.1/<subdomain>/foo/bar/baz
enable: true,
baseDomains: [
// some wildcarded DNS domains resolving to 127.0.0.1
'localtest.me',
'lvh.me',
'vcap.me',
'lacolhost.com',
],
},
logs: {
level: 'info', // error, warn, info, verbose, debug, silly
logsDir: './logs',
reqLogFormat: 'short', // used for morgan (request logging)
},
}
git-server
comes with a built-in winston logger. The log level (error
, warn
, info
, verbose
, debug
, silly
) can be set via the logs.level
property in the config (see above).
Alternatively you can pass your own winston logger instance:
// git server
const gitServer = require('@adobe/git-server/lib/server.js');
// git server config
const config = require('./config.js');
// inject winston logger instance
config.logger = require('winston').createLogger({ /* ... */ });
gitServer.start(config);
1. Create a local Git repository
cd ./repos
# create org
mkdir helix && cd helix
# initialize new git repo
mkdir test && cd test && git init
# allow to remotely push to this repo
git config receive.denyCurrentBranch updateInstead
# add a README.md
echo '# test repo'>README.md
git add . && git commit -m '1st commit'
cd ../../..
2. Start server
npm start
3. Fetch raw content of file in Git repo over http
curl http://localhost:5000/raw/helix/test/master/README.md
Git Protocols and APIs
1. Git Raw Protocol
Serving content of a file in a git repo.
The requested file is specified by:
{owner}
: GitHub organization or user{repo}
: repository name{ref}
: Git reference- branch name (e.g.
master
) - tag name (e.g.
v1.0
) - (full or shorthand) commit id (e.g.
7aeff3d
)
- branch name (e.g.
GitHub URLs:
https://raw.githubusercontent.com/{owner}/{repo}/{ref}/path/to/file
https://github.com/{owner}/{repo}/raw/{ref}/path/to/file
Local git-server
URLs:
http://localhost:{port}/raw/{owner}/{repo}/{ref}/path/to/file
http://localhost:{port}/{owner}/{repo}/raw/{ref}/path/to/file
http://raw.localtest.me:{port}/{owner}/{repo}/{ref}/path/to/file
(using wildcarded DNS domain resolving to127.0.0.1
)
Remote examples:
https://raw.githubusercontent.com/adobe/project-helix/master/README.md
https://github.com/adobe/project-helix/raw/master/README.md
Local examples:
http://raw.localtest.me:5000/adobe/project-helix/master/README.md
http://localhost:5000/adobe/project-helix/raw/master/README.md
http://localhost:5000/raw/adobe/project-helix/master/README.md
raw.githubusercontent.com
serves certain file types (e.g. JavaScript, CSS, HTML) with incorrect Content-Type: text/plain
header. 3rd party solutions like rawgit.com
address this issue. git-server
serves files with correct content type.
2. Git HTTP Transfer Protocols
Support for git clone, push, fetch
Documentation:
git push
support
The served local repo needs to be either a bare repo (git clone --bare
or git init --bare
) or the following option needs to be set:
git config receive.denyCurrentBranch updateInstead
3. GitHub API v3
Documentation: https://developer.github.com/v3/
GitHub Endpoint: https://api.github.com/
Local endpoint: http://localhost:{port}/api
or e.g. http://api.localtest.me:{port}
(using wildcarded DNS domain resolving to 127.0.0.1
)
Only a small subset of the GitHub API will be supported:
-
Note: The GitHub implementation supports files up to 1 megabyte in size.
-
Note: The GitHub implementation supports blobs up to 100 megabytes in size.
-
Note: This method returns a
302
to a URL to download a tarball or zipball archive for a repository.git-server
also supports an unofficialhttps://codeload.github.com
endpoint that is not rate limited and that doesn't redirect:https://codeload.github.com/{owner}/{repo}/[zip|tar.gz]/master
Related issue/discussion: #5 Support codeload.github.com
Local examples:
http://api.localtest.me:5000/repos/adobe/project-helix/contents/README.md?ref=master
http://api.localtest.me:5000/repos/adobe/project-helix/git/blobs/bf13fe66cbee379db6a3e4ebf0300b8bbc0f01b7
http://localhost:5000/api/repos/adobe/project-helix/contents/README.md?ref=master
http://localhost:5000/api/repos/adobe/project-helix/git/blobs/bf13fe66cbee379db6a3e4ebf0300b8bbc0f01b7
4. GitHub-like Web Server
(not yet implemented)
Endpoint: https://github.com/
e.g.
https://github.com/{owner}/{repo}
,
https://github.com/{owner}/{repo}/blob/{branch}/path/to/file