{"id":16742060,"url":"https://github.com/nmeum/git-shuffle","last_synced_at":"2025-04-10T13:23:03.451Z","repository":{"id":65587073,"uuid":"301135891","full_name":"nmeum/git-shuffle","owner":"nmeum","description":"Randomize Git commit timestamps to enhance privacy","archived":false,"fork":false,"pushed_at":"2022-01-01T23:00:21.000Z","size":42,"stargazers_count":10,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-24T12:09:03.986Z","etag":null,"topics":["git","privacy"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nmeum.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-10-04T13:25:25.000Z","updated_at":"2024-09-28T04:42:39.000Z","dependencies_parsed_at":"2023-01-30T18:25:11.349Z","dependency_job_id":null,"html_url":"https://github.com/nmeum/git-shuffle","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nmeum%2Fgit-shuffle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nmeum%2Fgit-shuffle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nmeum%2Fgit-shuffle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nmeum%2Fgit-shuffle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nmeum","download_url":"https://codeload.github.com/nmeum/git-shuffle/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248225664,"owners_count":21068078,"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":["git","privacy"],"created_at":"2024-10-13T01:08:41.614Z","updated_at":"2025-04-10T13:23:03.416Z","avatar_url":"https://github.com/nmeum.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# git-shuffle\n\nRandomize timestamps associated with Git commits to enhance privacy.\n\n## Motivation\n\nGit associates timestamps with commits. These timestamps expose coding\nhours and thereby potentially violate ones privacy. This tool randomizes\nthe hour of the day, as contained in these timestamps, to enhance\nprivacy. The tool can be employed automatically for all Git repository\nthrough global `githooks(5)` (see below).\n\n## Status\n\nI use this daily, works entirely fine for my purposes as is.\n\n## Installation\n\nThis software only requires [libgit2][libgit2 website]. If libgit2 was\ninstalled successfully, compile this software as follows:\n\n\tmake\n\nAfterwards, the software can be installed system-wide using:\n\n\tmake install\n\n## Usage\n\nThis tool can be invoked manually from a Git repository. For example,\nthe following command would randomize timestamps of all unpushed\ncommits on the `master` branch (i.e. behaves like `git-rebase(1)`):\n\n\t$ git shuffle origin/master\n\nHowever, it is likely desirable to automate this process through global\n`githooks(5)`. For this purpose `core.hooksPath` will need to be set\nusing `git-config(1)`. Additionally, a `post-commit` hook must be\ncreated which amends the previously created commit. For example using:\n\n\t$ git config --global core.hooksPath ~/.config/git/hooks\n\t$ mkdir -p ~/.config/git/hooks\n\t$ printf \"#!/bin/sh\\ngit shuffle -a\\n\" \u003e ~/.config/git/hooks/post-commit\n\t$ chmod +x ~/.config/git/hooks/post-commit\n\nProgram usage is described further in the provided man page.\n\n## Portability\n\nThis code requires `getentropy(3)` (which is available on Linux and\nOpenBSD but not mandated by POSIX) and `timegm(3)` and `err.h` which are\nalso not mandated by POSIX but widely available on both Linux and BSD\nsystems.\n\n## Related Work\n\nThe [git-privacy][git-privacy repo] utility shares the same goals but\nhas way more configuration options and is thus more complicated.\nFurthermore, it doesn't utilize [libgit2][libgit2 website].\n\n## License\n\nThis program is free software: you can redistribute it and/or modify it\nunder the terms of the GNU General Public License as published by the\nFree Software Foundation, either version 3 of the License, or (at your\noption) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\nPublic License for more details.\n\nYou should have received a copy of the GNU General Public License along\nwith this program. If not, see \u003chttp://www.gnu.org/licenses/\u003e.\n\n[libgit2 website]: https://libgit2.org/\n[git-privacy repo]: https://github.com/EMPRI-DEVOPS/git-privacy\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnmeum%2Fgit-shuffle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnmeum%2Fgit-shuffle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnmeum%2Fgit-shuffle/lists"}