{"id":16944602,"url":"https://github.com/krgn/suavegit","last_synced_at":"2025-07-15T09:03:38.380Z","repository":{"id":144199463,"uuid":"93882663","full_name":"krgn/SuaveGit","owner":"krgn","description":"Routes for serving git repositories via Suave","archived":false,"fork":false,"pushed_at":"2017-06-12T09:49:06.000Z","size":116,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-24T14:49:45.523Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"F#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/krgn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-06-09T17:39:56.000Z","updated_at":"2021-12-18T09:56:59.000Z","dependencies_parsed_at":"2023-06-16T15:45:15.046Z","dependency_job_id":null,"html_url":"https://github.com/krgn/SuaveGit","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/krgn/SuaveGit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krgn%2FSuaveGit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krgn%2FSuaveGit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krgn%2FSuaveGit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krgn%2FSuaveGit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/krgn","download_url":"https://codeload.github.com/krgn/SuaveGit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krgn%2FSuaveGit/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265424328,"owners_count":23762880,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-13T21:18:43.289Z","updated_at":"2025-07-15T09:03:38.340Z","avatar_url":"https://github.com/krgn.png","language":"F#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Suave.Git\n\nServe git repositories (bare \u0026 non-bare) via HTTP from\n[Suave](http://suave.io). These routes implement the [Smart HTTP\nProtocol](https://github.com/git/git/blob/master/Documentation/technical/http-protocol.txt). \n\nThe following operations are known to work:\n\n- `git pull`\n- `git push`\n- `git clone`\n- `git ls-remote`\n\n## Build Status\n\n| Platform   | Status         |\n| --------   | -------------- |\n| Windows    | [![Build status](https://ci.appveyor.com/api/projects/status/4ftgdgx0ujmb5f2j?svg=true)](https://travis-ci.org/SuaveIO/suave) |\n| Mono/Linux | [![Build status](https://travis-ci.org/krgn/SuaveGit.svg?branch=master)](https://travis-ci.org/SuaveIO/suave) |\n\n## Example\n\nA short example how this API is used:\n\n```fsharp\n\nlet dir = \"/home/k/projects\"\nlet name = \"myproject\"  // the directory containing .git (non-bare) or a bare repository\n\nlet createServer () =\n  let cts = new CancellationTokenSource()\n\n  let config =\n    { defaultConfig with\n        cancellationToken = cts.Token\n        bindings = [ HttpBinding.create HTTP IPAddress.Loopback 7000us ] }\n\n  // This will create the following routes:\n  //\n  // - GET  \"/myproject/info/refs\"\n  // - POST \"/myproject/git-upload-pack\" \n  // - POST \"/myproject/git-receive-pack\" \n  //\n  // If the first parmeter is `None`, the path will be in the root.\n  \n  Path.Combine(dir,name)\n  |\u003e gitServer (Some name) \n  |\u003e startWebServerAsync config \n  |\u003e (fun (_, server) -\u003e Async.Start(server, cts.Token))\n\n  // On very slow machines (AppVeyor) it sometimes takes\n  // around 100ms, so we wait a little to make sure the server is up\n  Thread.Sleep(150)\n\n  { new IDisposable with\n      member self.Dispose() =\n        try\n          cts.Cancel()\n          cts.Dispose()\n        with | _ -\u003e () }\n\nuse server = createServer()\n\n```\n\nOnce running, you can use the regular commands to add remotes and clone. \n\n```shell\ngit clone http://localhost:7000/myproject myclone\n```\n\n## Repository Configuration\n\nIf you intend to serve _non-bare_ repositories, make sure you set this\noption on the repository to ensure `git push` will also update your\ncurrently checked out branch.\n\n```shell\ngit config --local receive.denyCurrentBranch updateInstead\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrgn%2Fsuavegit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkrgn%2Fsuavegit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrgn%2Fsuavegit/lists"}