{"action":"created","comment":{"url":"https://api.github.com/repos/ThierryO/git2r/pulls/comments/206074680","pull_request_review_id":141450001,"id":206074680,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwNjA3NDY4MA==","diff_hunk":"@@ -0,0 +1,200 @@\n+---\n+title: \"Data repository\"\n+author: \"Thierry Onkelinx\"\n+date: \"`r Sys.Date()`\"\n+output: rmarkdown::html_vignette\n+vignette: >\n+  %\\VignetteIndexEntry{Data repository}\n+  %\\VignetteEngine{knitr::rmarkdown}\n+  %\\VignetteEncoding{UTF-8}\n+---\n+\n+```{r setup, include = FALSE}\n+library(knitr)\n+opts_chunk$set(\n+  collapse = TRUE,\n+  comment = \"#>\"\n+)\n+```\n+\n+## Rationale\n+\n+In some cases we want to place data under version control. Data refers here to the information which is stored in a rectangular format. The columns define variables, while the rows represent observations. There is no information in neither the order of the columns nor the order of the rows. We assume that the data is available a an R `data.frame`.\n+\n+Although git can store binary files, its real power and efficiency is with plain text files. R has several functions to read and write `data.frames` as plain text files. Main downside is the loss of meta data, especially in case of `factors`. A `factor` will be written as a `character` and hence lose all information on the levels. This can be important when the levels are a) not sorted alphabetical, b) not all levels have observations or c) the `factor` is ordered. Besides that, storing a `factor` as `character` is not efficient.\n+\n+Git stores the version history under the form of diffs: a list of lines which are deleted and a list of lines which are inserted at a specific line number in a file. We have to keep this in mind when storing data as plain text files in Git. The table below indicate what impact changing the information content has on the diff in Git. Note that changing observations requires a small diff, while changing variables results in a massive diff.\n+\n+```{r echo = FALSE}\n+cases <- rbind(\n+    c(\"remove 1 observation\", \"remove 1 line\"),\n+    c(\"add 1 observation\", \"add 1 line\"),\n+    c(\"update 1 observation\", \"remove 1 line and add 1 line\"),\n+    c(\"remove 1 variable\", \"remove all lines and add all lines\"),\n+    c(\"add 1 variable\", \"remove all lines and add all lines\")\n+)\n+colnames(cases) <- c(\"Change in data\", \"Git diff\")\n+kable(cases, caption = \"Changes in the information content of the data\")\n+```\n+\n+In the next table we show the effect on the diff when making changes in the data which don't change in the information content in the data.\n+\n+```{r echo = FALSE}\n+cases <- rbind(\n+    c(\"move 1 observation\", \"remove 1 line and add 1 line\"),\n+    c(\"move 1 variable\", \"remove all lines and add all lines\")\n+)\n+colnames(cases) <- c(\"Change in data\", \"Git diff\")\n+kable(cases, caption = \"Changes in the data without changing the information content\")\n+```\n+\n+So in order to use Git a a performant and efficient version control system for data, we need to make sure to store the meta data and keep the diffs as small as possible.\n+\n+## Tools in `git2r`\n+\n+### Data repository\n+\n+A 'data repository' refers to a sub directory within the root of an existing git repository. Create a `data_repository` object with `init()` or `repository()` and specify the sub directory through the `project` argument. Most functions of the package handle a `data_repository` object in the same way as they handle a `git_repository` object. The main difference is that the working directory points to the sub directory of the root, rather that the root of the git repository. You can create multiple data repositories within the same git repository.\n+\n+```{r}\n+# Create a directory in tempdir\n+path <- tempfile(pattern = \"git2r-\")\n+dir.create(path)\n+\n+library(git2r)\n+# inititialize a new git repository\n+repo <- init(path)\n+# use a data repository in an existing git repository\n+data_repo <- repository(path, project = \"test\")\n+```\n+\n+```{r eval = FALSE}\n+# inititialize a new git repository and use a data repository within it\n+data_repo <- init(path, project = \"test\")\n+```\n+\n+### Storing data\n+\n+Use `write_delim_git()` to store a `data.frame` into the data repository. The function will separate the data and the meta data. The data is stored as a headerless, unquoted tab delimited file with \".tsv\" extension and UTF-8 encoding. The meta data is stored in YAML format with \".yml\" format. Therefore any extension given to the `file` will be stripped (with a warning).\n+\n+The function will do a lot more preprocessing to the data in order to keep the file and the diff as small as possible. That is the reason why the data is stored headerless and unquoted. \n+\n+- `logical` is written as 0 (FALSE), 1 (TRUE) or NA to the data. The class is stored in the meta data.\n+- `integer` is written as is to the data. The class is stored in the meta data.\n+- `numeric` is written as is to the data. The class is stored in the meta data.\n+- `complex` is written as is to the data. The class is stored in the meta data.\n+- `character` is written as is and unquoted to the data. The class is stored in the meta data.\n+- `factor` is  stored as its indices in the data. The labels of levels are stored in the meta data.\n+- `POSIXct` is written as an integer to the data. The class and the origin are stored in the meta data.\n+\n+```{r}\n+# Create dummy data\n+x <- data.frame(\n+    x = LETTERS,\n+    y = factor(\n+        sample(c(\"a\", \"b\", NA), 26, replace = TRUE),\n+        levels = c(\"a\", \"b\", \"c\")\n+    ),\n+    z = c(NA, 1:25),\n+    abc = c(rnorm(25), NA),\n+    xyz = complex(real = rnorm(26), imaginary = rnorm(26)),\n+    def = sample(c(TRUE, FALSE, NA), 26, replace = TRUE),\n+    timestamp = seq(\n+        as.POSIXct(\"2018-01-01\"),\n+        as.POSIXct(\"2019-01-01\"),\n+        length = 26\n+    ),\n+    stringsAsFactors = FALSE\n+)\n+str(x)\n+```\n+\n+Another important part of the preprocessing is ordering both the variables as the observations. This is determined when the file is created and stored in the meta data. When the file is overwritten, the ordering is based on the existing meta data. Therefore it is important to think carefully about the ordering and make sure that is how you want it to stay **before** you create your first commit. The ordering of the observations is specified through the `sorting` argument. It holds a vector of variable names which are used in the ordering. Make sure that you add enough sorting variables to avoid ties. `sorting` also defines the order of the variables, the order of the other variables is taken from the `data.frame`.\n+\n+The data file (\".tsv\") and the meta data file (\".yml\") are automatically staged after writing. `write_delim_git()` returns the hashes of both the data file and the meta data file. The names of the vector contain the path of the files, relative to the root of the _git_ repository.\n+\n+```{r}\n+status(data_repo)\n+write_delim_git(x = x, file = \"my_data\", repo = data_repo, sorting = c(\"y\", \"x\"))\n+status(data_repo)\n+status(repo)\n+```\n+\n+Overwriting data which has different meta data than the original data will throw an error because this can potentially lead to large diffs. Differences in meta data occur when:\n+\n+- the sorting changes\n+- variables are added, removed or renamed\n+- the class of a variable changes\n+- the levels of a factor changes\n+\n+However you can bypass this by using `override = TRUE`. This will completely ignore the existing meta data and create new meta data based on the new `data.frame`.\n+\n+```{r error=TRUE}\n+y <- x\n+y$extra <- x$x\n+write_delim_git(y, file = \"my_data\", repo = data_repo, sorting = c(\"y\", \"x\"))\n+write_delim_git(\n+    y, file = \"my_data\", repo = data_repo, sorting = c(\"y\", \"x\"), \n+    override = TRUE\n+)\n+```\n+\n+### Reading data\n+\n+Retrieving data is straight forward. Use `read_delim_git` and provide the `file` and the `repo`. The retrieved data is identical to the original data after applying the ordering of variables and observations.\n+\n+```{r}\n+y_stored <- read_delim_git(file = \"my_data\", repo = data_repo)\n+str(y_stored)\n+y_sorted <- y[order(y$y, y$x), colnames(y_stored)]\n+rownames(y_sorted) <- NULL\n+stopifnot(all.equal(y_sorted, y_stored))\n+```\n+\n+### Committing changes\n+\n+Commit the changes using `commit()`\n+\n+```{r}\n+write_delim_git(x, file = \"sub/test\", repo = data_repo, sorting = \"x\")\n+status(data_repo)\n+commit(data_repo, message = \"Initial commit\")\n+status(data_repo)\n+```\n+\n+### Removing data\n+\n+Data objects can be removed with `rm_file`. Provide the data repository to `repo` and the data object name to `path`. `path` can take multiple data objects.\n+\n+```{r}\n+# remove a single data object\n+rm_file(repo = data_repo, path = \"my_data\")\n+status(data_repo)\n+# undo the remove by resetting to the last commit\n+reset(commits(data_repo)[[1]], \"hard\")\n+status(data_repo)\n+# remove multiple data objects\n+rm_file(repo = data_repo, path = c(\"my_data\", \"sub/test\"))\n+status(data_repo)\n+```\n+\n+Note that this will remove both the data and the meta data. In case you want to update the current data, it is better to overwrite the data than first delete it and then write it. Sometime you want to write a bunch of data object to the data repository and you cannot guarantee that all data objects will remain after the update. The workflow below is intended for such case.","path":"vignettes/data-repository.Rmd","position":181,"original_position":181,"commit_id":"cbf21f126f75b603ebd205dd76d540cc09923f3a","original_commit_id":"cbf21f126f75b603ebd205dd76d540cc09923f3a","user":{"login":"stijnvanhoey","id":754862,"node_id":"MDQ6VXNlcjc1NDg2Mg==","avatar_url":"https://avatars1.githubusercontent.com/u/754862?v=4","gravatar_id":"","url":"https://api.github.com/users/stijnvanhoey","html_url":"https://github.com/stijnvanhoey","followers_url":"https://api.github.com/users/stijnvanhoey/followers","following_url":"https://api.github.com/users/stijnvanhoey/following{/other_user}","gists_url":"https://api.github.com/users/stijnvanhoey/gists{/gist_id}","starred_url":"https://api.github.com/users/stijnvanhoey/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stijnvanhoey/subscriptions","organizations_url":"https://api.github.com/users/stijnvanhoey/orgs","repos_url":"https://api.github.com/users/stijnvanhoey/repos","events_url":"https://api.github.com/users/stijnvanhoey/events{/privacy}","received_events_url":"https://api.github.com/users/stijnvanhoey/received_events","type":"User","site_admin":false},"body":"I also would start a new paragraph or subsection on 'Sometimes...' as you define here a really specific case ","created_at":"2018-07-30T09:52:16Z","updated_at":"2018-07-30T09:59:03Z","html_url":"https://github.com/ThierryO/git2r/pull/1#discussion_r206074680","pull_request_url":"https://api.github.com/repos/ThierryO/git2r/pulls/1","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/ThierryO/git2r/pulls/comments/206074680"},"html":{"href":"https://github.com/ThierryO/git2r/pull/1#discussion_r206074680"},"pull_request":{"href":"https://api.github.com/repos/ThierryO/git2r/pulls/1"}},"in_reply_to_id":206074274},"pull_request":{"url":"https://api.github.com/repos/ThierryO/git2r/pulls/1","id":203508274,"node_id":"MDExOlB1bGxSZXF1ZXN0MjAzNTA4Mjc0","html_url":"https://github.com/ThierryO/git2r/pull/1","diff_url":"https://github.com/ThierryO/git2r/pull/1.diff","patch_url":"https://github.com/ThierryO/git2r/pull/1.patch","issue_url":"https://api.github.com/repos/ThierryO/git2r/issues/1","number":1,"state":"open","locked":false,"title":"Add support for data repositories","user":{"login":"ThierryO","id":446636,"node_id":"MDQ6VXNlcjQ0NjYzNg==","avatar_url":"https://avatars2.githubusercontent.com/u/446636?v=4","gravatar_id":"","url":"https://api.github.com/users/ThierryO","html_url":"https://github.com/ThierryO","followers_url":"https://api.github.com/users/ThierryO/followers","following_url":"https://api.github.com/users/ThierryO/following{/other_user}","gists_url":"https://api.github.com/users/ThierryO/gists{/gist_id}","starred_url":"https://api.github.com/users/ThierryO/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ThierryO/subscriptions","organizations_url":"https://api.github.com/users/ThierryO/orgs","repos_url":"https://api.github.com/users/ThierryO/repos","events_url":"https://api.github.com/users/ThierryO/events{/privacy}","received_events_url":"https://api.github.com/users/ThierryO/received_events","type":"User","site_admin":false},"body":"Add functionality to store and retrieve R data.frames to a git repository as git optimized text files","created_at":"2018-07-24T12:22:58Z","updated_at":"2018-07-30T09:59:03Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d386329b4dec42f5182892fe53b7e6cad9b55648","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/ThierryO/git2r/pulls/1/commits","review_comments_url":"https://api.github.com/repos/ThierryO/git2r/pulls/1/comments","review_comment_url":"https://api.github.com/repos/ThierryO/git2r/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ThierryO/git2r/issues/1/comments","statuses_url":"https://api.github.com/repos/ThierryO/git2r/statuses/cbf21f126f75b603ebd205dd76d540cc09923f3a","head":{"label":"ThierryO:datarepos","ref":"datarepos","sha":"cbf21f126f75b603ebd205dd76d540cc09923f3a","user":{"login":"ThierryO","id":446636,"node_id":"MDQ6VXNlcjQ0NjYzNg==","avatar_url":"https://avatars2.githubusercontent.com/u/446636?v=4","gravatar_id":"","url":"https://api.github.com/users/ThierryO","html_url":"https://github.com/ThierryO","followers_url":"https://api.github.com/users/ThierryO/followers","following_url":"https://api.github.com/users/ThierryO/following{/other_user}","gists_url":"https://api.github.com/users/ThierryO/gists{/gist_id}","starred_url":"https://api.github.com/users/ThierryO/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ThierryO/subscriptions","organizations_url":"https://api.github.com/users/ThierryO/orgs","repos_url":"https://api.github.com/users/ThierryO/repos","events_url":"https://api.github.com/users/ThierryO/events{/privacy}","received_events_url":"https://api.github.com/users/ThierryO/received_events","type":"User","site_admin":false},"repo":{"id":41428891,"node_id":"MDEwOlJlcG9zaXRvcnk0MTQyODg5MQ==","name":"git2r","full_name":"ThierryO/git2r","owner":{"login":"ThierryO","id":446636,"node_id":"MDQ6VXNlcjQ0NjYzNg==","avatar_url":"https://avatars2.githubusercontent.com/u/446636?v=4","gravatar_id":"","url":"https://api.github.com/users/ThierryO","html_url":"https://github.com/ThierryO","followers_url":"https://api.github.com/users/ThierryO/followers","following_url":"https://api.github.com/users/ThierryO/following{/other_user}","gists_url":"https://api.github.com/users/ThierryO/gists{/gist_id}","starred_url":"https://api.github.com/users/ThierryO/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ThierryO/subscriptions","organizations_url":"https://api.github.com/users/ThierryO/orgs","repos_url":"https://api.github.com/users/ThierryO/repos","events_url":"https://api.github.com/users/ThierryO/events{/privacy}","received_events_url":"https://api.github.com/users/ThierryO/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ThierryO/git2r","description":"R bindings to the libgit2 library","fork":true,"url":"https://api.github.com/repos/ThierryO/git2r","forks_url":"https://api.github.com/repos/ThierryO/git2r/forks","keys_url":"https://api.github.com/repos/ThierryO/git2r/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ThierryO/git2r/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ThierryO/git2r/teams","hooks_url":"https://api.github.com/repos/ThierryO/git2r/hooks","issue_events_url":"https://api.github.com/repos/ThierryO/git2r/issues/events{/number}","events_url":"https://api.github.com/repos/ThierryO/git2r/events","assignees_url":"https://api.github.com/repos/ThierryO/git2r/assignees{/user}","branches_url":"https://api.github.com/repos/ThierryO/git2r/branches{/branch}","tags_url":"https://api.github.com/repos/ThierryO/git2r/tags","blobs_url":"https://api.github.com/repos/ThierryO/git2r/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ThierryO/git2r/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ThierryO/git2r/git/refs{/sha}","trees_url":"https://api.github.com/repos/ThierryO/git2r/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ThierryO/git2r/statuses/{sha}","languages_url":"https://api.github.com/repos/ThierryO/git2r/languages","stargazers_url":"https://api.github.com/repos/ThierryO/git2r/stargazers","contributors_url":"https://api.github.com/repos/ThierryO/git2r/contributors","subscribers_url":"https://api.github.com/repos/ThierryO/git2r/subscribers","subscription_url":"https://api.github.com/repos/ThierryO/git2r/subscription","commits_url":"https://api.github.com/repos/ThierryO/git2r/commits{/sha}","git_commits_url":"https://api.github.com/repos/ThierryO/git2r/git/commits{/sha}","comments_url":"https://api.github.com/repos/ThierryO/git2r/comments{/number}","issue_comment_url":"https://api.github.com/repos/ThierryO/git2r/issues/comments{/number}","contents_url":"https://api.github.com/repos/ThierryO/git2r/contents/{+path}","compare_url":"https://api.github.com/repos/ThierryO/git2r/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ThierryO/git2r/merges","archive_url":"https://api.github.com/repos/ThierryO/git2r/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ThierryO/git2r/downloads","issues_url":"https://api.github.com/repos/ThierryO/git2r/issues{/number}","pulls_url":"https://api.github.com/repos/ThierryO/git2r/pulls{/number}","milestones_url":"https://api.github.com/repos/ThierryO/git2r/milestones{/number}","notifications_url":"https://api.github.com/repos/ThierryO/git2r/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ThierryO/git2r/labels{/name}","releases_url":"https://api.github.com/repos/ThierryO/git2r/releases{/id}","deployments_url":"https://api.github.com/repos/ThierryO/git2r/deployments","created_at":"2015-08-26T14:01:13Z","updated_at":"2018-07-27T13:55:53Z","pushed_at":"2018-07-27T19:14:27Z","git_url":"git://github.com/ThierryO/git2r.git","ssh_url":"git@github.com:ThierryO/git2r.git","clone_url":"https://github.com/ThierryO/git2r.git","svn_url":"https://github.com/ThierryO/git2r","homepage":"","size":9114,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"gpl-2.0","name":"GNU General Public License v2.0","spdx_id":"GPL-2.0","url":"https://api.github.com/licenses/gpl-2.0","node_id":"MDc6TGljZW5zZTg="},"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"ThierryO:master","ref":"master","sha":"7709cbbdc19b28996f5cffda575c947ba1e3f60d","user":{"login":"ThierryO","id":446636,"node_id":"MDQ6VXNlcjQ0NjYzNg==","avatar_url":"https://avatars2.githubusercontent.com/u/446636?v=4","gravatar_id":"","url":"https://api.github.com/users/ThierryO","html_url":"https://github.com/ThierryO","followers_url":"https://api.github.com/users/ThierryO/followers","following_url":"https://api.github.com/users/ThierryO/following{/other_user}","gists_url":"https://api.github.com/users/ThierryO/gists{/gist_id}","starred_url":"https://api.github.com/users/ThierryO/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ThierryO/subscriptions","organizations_url":"https://api.github.com/users/ThierryO/orgs","repos_url":"https://api.github.com/users/ThierryO/repos","events_url":"https://api.github.com/users/ThierryO/events{/privacy}","received_events_url":"https://api.github.com/users/ThierryO/received_events","type":"User","site_admin":false},"repo":{"id":41428891,"node_id":"MDEwOlJlcG9zaXRvcnk0MTQyODg5MQ==","name":"git2r","full_name":"ThierryO/git2r","owner":{"login":"ThierryO","id":446636,"node_id":"MDQ6VXNlcjQ0NjYzNg==","avatar_url":"https://avatars2.githubusercontent.com/u/446636?v=4","gravatar_id":"","url":"https://api.github.com/users/ThierryO","html_url":"https://github.com/ThierryO","followers_url":"https://api.github.com/users/ThierryO/followers","following_url":"https://api.github.com/users/ThierryO/following{/other_user}","gists_url":"https://api.github.com/users/ThierryO/gists{/gist_id}","starred_url":"https://api.github.com/users/ThierryO/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ThierryO/subscriptions","organizations_url":"https://api.github.com/users/ThierryO/orgs","repos_url":"https://api.github.com/users/ThierryO/repos","events_url":"https://api.github.com/users/ThierryO/events{/privacy}","received_events_url":"https://api.github.com/users/ThierryO/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ThierryO/git2r","description":"R bindings to the libgit2 library","fork":true,"url":"https://api.github.com/repos/ThierryO/git2r","forks_url":"https://api.github.com/repos/ThierryO/git2r/forks","keys_url":"https://api.github.com/repos/ThierryO/git2r/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ThierryO/git2r/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ThierryO/git2r/teams","hooks_url":"https://api.github.com/repos/ThierryO/git2r/hooks","issue_events_url":"https://api.github.com/repos/ThierryO/git2r/issues/events{/number}","events_url":"https://api.github.com/repos/ThierryO/git2r/events","assignees_url":"https://api.github.com/repos/ThierryO/git2r/assignees{/user}","branches_url":"https://api.github.com/repos/ThierryO/git2r/branches{/branch}","tags_url":"https://api.github.com/repos/ThierryO/git2r/tags","blobs_url":"https://api.github.com/repos/ThierryO/git2r/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ThierryO/git2r/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ThierryO/git2r/git/refs{/sha}","trees_url":"https://api.github.com/repos/ThierryO/git2r/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ThierryO/git2r/statuses/{sha}","languages_url":"https://api.github.com/repos/ThierryO/git2r/languages","stargazers_url":"https://api.github.com/repos/ThierryO/git2r/stargazers","contributors_url":"https://api.github.com/repos/ThierryO/git2r/contributors","subscribers_url":"https://api.github.com/repos/ThierryO/git2r/subscribers","subscription_url":"https://api.github.com/repos/ThierryO/git2r/subscription","commits_url":"https://api.github.com/repos/ThierryO/git2r/commits{/sha}","git_commits_url":"https://api.github.com/repos/ThierryO/git2r/git/commits{/sha}","comments_url":"https://api.github.com/repos/ThierryO/git2r/comments{/number}","issue_comment_url":"https://api.github.com/repos/ThierryO/git2r/issues/comments{/number}","contents_url":"https://api.github.com/repos/ThierryO/git2r/contents/{+path}","compare_url":"https://api.github.com/repos/ThierryO/git2r/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ThierryO/git2r/merges","archive_url":"https://api.github.com/repos/ThierryO/git2r/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ThierryO/git2r/downloads","issues_url":"https://api.github.com/repos/ThierryO/git2r/issues{/number}","pulls_url":"https://api.github.com/repos/ThierryO/git2r/pulls{/number}","milestones_url":"https://api.github.com/repos/ThierryO/git2r/milestones{/number}","notifications_url":"https://api.github.com/repos/ThierryO/git2r/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ThierryO/git2r/labels{/name}","releases_url":"https://api.github.com/repos/ThierryO/git2r/releases{/id}","deployments_url":"https://api.github.com/repos/ThierryO/git2r/deployments","created_at":"2015-08-26T14:01:13Z","updated_at":"2018-07-27T13:55:53Z","pushed_at":"2018-07-27T19:14:27Z","git_url":"git://github.com/ThierryO/git2r.git","ssh_url":"git@github.com:ThierryO/git2r.git","clone_url":"https://github.com/ThierryO/git2r.git","svn_url":"https://github.com/ThierryO/git2r","homepage":"","size":9114,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"gpl-2.0","name":"GNU General Public License v2.0","spdx_id":"GPL-2.0","url":"https://api.github.com/licenses/gpl-2.0","node_id":"MDc6TGljZW5zZTg="},"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ThierryO/git2r/pulls/1"},"html":{"href":"https://github.com/ThierryO/git2r/pull/1"},"issue":{"href":"https://api.github.com/repos/ThierryO/git2r/issues/1"},"comments":{"href":"https://api.github.com/repos/ThierryO/git2r/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/ThierryO/git2r/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/ThierryO/git2r/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ThierryO/git2r/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/ThierryO/git2r/statuses/cbf21f126f75b603ebd205dd76d540cc09923f3a"}},"author_association":"OWNER"}}
{"actor":{"display_login":"stijnvanhoey"}}