{"id":14066026,"url":"https://github.com/ropensci-training/saperlipopette","last_synced_at":"2026-03-05T15:01:46.935Z","repository":{"id":212673403,"uuid":"732046693","full_name":"ropensci-training/saperlipopette","owner":"ropensci-training","description":"Exercises (playgrounds) to go with ohshitgit and beyond, for R users","archived":false,"fork":false,"pushed_at":"2026-02-18T15:27:04.000Z","size":5304,"stargazers_count":32,"open_issues_count":4,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-18T19:22:55.736Z","etag":null,"topics":["git","rstats","rstats-package"],"latest_commit_sha":null,"homepage":"https://docs.ropensci.org/saperlipopette/","language":"R","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/ropensci-training.png","metadata":{"files":{"readme":"README.Rmd","changelog":"NEWS.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-12-15T14:04:29.000Z","updated_at":"2026-02-18T15:26:18.000Z","dependencies_parsed_at":"2023-12-15T15:25:59.003Z","dependency_job_id":"8f0c151d-8b7a-410d-b254-e6c491757df4","html_url":"https://github.com/ropensci-training/saperlipopette","commit_stats":null,"previous_names":["maelle/saperlipopette","ropensci-training/saperlipopette"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/ropensci-training/saperlipopette","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ropensci-training%2Fsaperlipopette","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ropensci-training%2Fsaperlipopette/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ropensci-training%2Fsaperlipopette/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ropensci-training%2Fsaperlipopette/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ropensci-training","download_url":"https://codeload.github.com/ropensci-training/saperlipopette/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ropensci-training%2Fsaperlipopette/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30132585,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-05T14:41:47.141Z","status":"ssl_error","status_checked_at":"2026-03-05T14:41:21.567Z","response_time":93,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["git","rstats","rstats-package"],"created_at":"2024-08-13T07:04:54.277Z","updated_at":"2026-03-05T15:01:46.909Z","avatar_url":"https://github.com/ropensci-training.png","language":"R","funding_links":[],"categories":["R"],"sub_categories":[],"readme":"---\noutput: github_document\n---\n\n\u003c!-- README.md is generated from README.Rmd. Please edit that file --\u003e\n\n```{r, include = FALSE}\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#\u003e\",\n  fig.path = \"man/figures/README-\",\n  out.width = \"100%\"\n)\n```\n\n# saperlipopette\n\n\u003c!-- badges: start --\u003e\n[![R-CMD-check](https://github.com/ropensci-training/saperlipopette/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/ropensci-training/saperlipopette/actions/workflows/R-CMD-check.yaml)\n[![Codecov test coverage](https://codecov.io/gh/ropensci-training/saperlipopette/graph/badge.svg)](https://app.codecov.io/gh/ropensci-training/saperlipopette)\n\u003c!-- badges: end --\u003e\n\nThe goal of saperlipopette is to hold functions creating Git exercises, \nthat users solve using their local and usual tools.\n\n## Installation\n\nYou can install the development version of saperlipopette like so, from R-universe:\n\n```r\ninstall.packages(\n  'saperlipopette', \n  repos = c('https://packages.ropensci.org', 'https://cloud.r-project.org')\n)\n```\n\n\nOr from GitHub: \n\n``` r\n# install.packages(\"pak\")\npak::pak(\"ropensci-training/saperlipopette\")\n```\n\nYou'll also need\n\n- a [Git installation](https://happygitwithr.com/install-git), but if you made it here you probably already use Git at least a bit.\n- [basic Git knowledge](#recommended-resources-about-git), in particular being able to examine the Git history, be it with [git log](https://git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-History) or a tool in your IDE.\n- a directory where to store the exercises folder. In all examples we use a temporary directory but if you prefer, you could use a dedicated \"scratch directory\".\n\n## Why this name?\n\nThis package is intended to be a companion to https://ohshitgit.com/,\nso its name had to honour the exclamation.\n\"saperlipopette\" is an [old-fashioned French exclamation](https://en.wiktionary.org/wiki/saperlipopette).\nYou can say \"Saperlipopette, Git!\".\n\n## Example\n\n```{r example}\nlibrary(\"saperlipopette\")\nparent_path \u003c- withr::local_tempdir()\npath \u003c- exo_one_small_change(parent_path)\n# what's in path\nfs::dir_tree(path)\n# with Git in a command line: git log\n# or the gert R package\ngert::git_log(repo = path)\n```\n\nAt this stage, the user would open the newly created R project and launch an R session,\nwhere messages would indicate them what to do, \nand which URL to follow, to find, in this case, the corresponding ohshitgit entry.\nIn practice here the user would change a file, then Git add it, then run `git commit --amend --no-edit`.\nThe user would examine the [Git history](https://git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-History) before and after this.\n\n```{r, echo=FALSE}\nsource(system.file(\n  \"exo_one_small_change-Rprofile.en.R\",\n  package = \"saperlipopette\"\n))\n```\n\nIf they need more instructions than what is initially provided, the user can run:\n\n```{r}\ntip()\n```\n\nThat interface relies on adding an `.Rprofile` to the newly created project,\nwith instructions formatted with the cli package.\n\nWe've set the Git author, committer and date so that the automatic commits get the same \nhashes, which can be useful when teaching a group: everyone should be looking at the same hashes on their machine, except for those commits they create themselves.\n\nBelow we use `gert::git_log()`, as opposed to `git log` in a command line, because that integrates better with R Markdown that we use for building documentation.\n\n```{r example2}\nparent_path \u003c- withr::local_tempdir()\npath \u003c- exo_one_small_change(parent_path)\ngert::git_log(repo = path)\nparent_path2 \u003c- withr::local_tempdir()\npath2 \u003c- exo_one_small_change(parent_path2)\ngert::git_log(repo = path2)\n```\n\n### Multilingual!\n\nThe saperlipopette can create messages in English (default) but also in French and Spanish.\nExample in French:\n\n```{r example-fr}\nlibrary(\"saperlipopette\")\nwithr::local_language(\"fr\")\nparent_path \u003c- withr::local_tempdir()\npath \u003c- exo_one_small_change(parent_path)\n# what's in path\nfs::dir_tree(path)\n# with Git in a command line: git log\n# or the gert R package\ngert::git_log(repo = path)\n```\n\n```{r, echo=FALSE}\nsource(system.file(\n  \"exo_one_small_change-Rprofile.fr.R\",\n  package = \"saperlipopette\"\n))\n```\n\n\n```{r}\ntip()\n```\n\n## Exercises\n\nConsult the [reference](https://docs.ropensci.org/saperlipopette/reference/index.html).\n\nExercises cover:\n\n- Oh Shit, Git!: exercises inspired by https://ohshitgit.com/ by Katie Sylor-Miller.\n- Clean history: exercises on how to get a clean Git history, for instance using rebase interactive.\n- Use history: exercises on how to use the Git history, for instance using blame.\n\n\nAs an individual learner, pick what you want to learn or try out!\nAs an instructor, you can mix and match exercises: for instance focussing the session on solving common mistakes (Oh Shit, Git!) or on why and how to create a clean Git history (exercises from \"Use history\" then exercises from \"Clean history\").\n\nFeel free to suggest new exercises by opening a GitHub [issue](https://github.com/ropensci-training/saperlipopette/issues).\n\n## Recommended resources about Git\n\nFor beginners:\n\n- [Happy Git with R](https://happygitwithr.com/)\n- [Learn Git branching](https://learngitbranching.js.org/)\n\nFor users less new to Git:\n\n- [Git in Practice by Mike McQuaid](https://masalmon.eu/2023/11/01/reading-notes-git-in-practice/)\n- [Pro Git by Scott Chacon](https://masalmon.eu/2024/01/19/pro-git-scott-chacon-reading-notes/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fropensci-training%2Fsaperlipopette","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fropensci-training%2Fsaperlipopette","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fropensci-training%2Fsaperlipopette/lists"}