{"thread":{"id":"62595","subject":"[ANNOUNCE] git-filter-repo 2.47.0","startedAt":"2024-12-04T04:33:27Z","lastAt":"2024-12-04T04:33:27Z","messageCount":1,"participants":["Elijah Newren"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"508596","messageId":"CABPp-BEEZdcdmtVFXSNnJ1NF+idyY_Npqxg+9Zv2ns+YDYuO_w@mail.gmail.com","threadId":"62595","inReplyTo":null,"subject":"[ANNOUNCE] git-filter-repo 2.47.0","fromName":"Elijah Newren","fromEmail":"newren@gmail.com","sentAt":"2024-12-04T04:33:15Z","receivedAt":"2024-12-04T04:33:27Z","isPatch":false,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"I am pleased to announce the release of git-filter-repo v2.47.0.\n\ngit filter-repo is a versatile tool for rewriting git repository\nhistory.  The public repo of filter-repo is at\n\n    https://github.com/newren/git-filter-repo\n\nThe tarballs can be found at:\n\n    https://github.com/newren/git-filter-repo/releases\n\ngit-filter-repo can also be installed via a variety of package managers\nacross Windows, Mac OS, or Linux (and maybe others)[1].\n\n[1] https://github.com/newren/git-filter-repo/blob/master/INSTALL.md\n\nThis is the biggest release of git-filter-repo (and by a significant\nmargin), excluding its first release.  It is comprised of 81 non-merge\ncommits since v2.45.0, including six commits from five new\ncontributors:\n\n  * Aaron Cooper\n  * David Linke\n  * Lars Schneider\n  * Sebastian Andrzej Siewior\n  * Vladislav Javadov\n\n----------------------------------------------------------------------\n\ngit-filter-repo 2.47 Release Notes\n==================================\n\nGiven that this is such a big release, I thought I'd provide a highlight\nof the highlights:\n\n  * Multiple bug fixes, including a few longstanding issues\n  * Several usability improvements to reduce confusion in special cases\n  * New --file-info-callback for operating on combination of filename &\n    file contents & file mode\n  * New --sensitive-data-removal flag, to assist users trying to remove\n    sensitive data from a repository and all its clones\n  * Rewriting stashes with the rest of the repository history\n  * New collection of example filterings based on user-filed issues\n\nFull list of user-visible changes:\n\n(Note: numeric references refer to GitHub issue IDs at\nhttps://github.com/newren/git-filter-repo/issues/)\n\n* Backward compatibility\n  * Bump python requirement to 3.6\n  * By default, do not create new replace references *and* consume the ones\n    that exist.  Use the --replace-refs option to change this, if wanted.\n    (#235)\n\n* Fixes:\n  * We have always bypassed fresh-clone safety checks if the user runs\n    git-filter-repo again.  However, if the\n    $GIT_DIR/filter-repo/already_ran file is really old, that may\n    suggest they have forgotten their previous rewrite.  If the file is\n    older than a day, prompt users for whether to consider this rewrite\n    a continuation of their previous one.\n  * Fix gnarly but rare corner case bug in tracking the combination of\n    pruned and inserted commits that could mess up rewrites, which could\n    e.g. cause a crash by making a commit think its ancestor was a\n    commit that does not exist)\n  * Skip over unexpected git-catfile output in --analyze mode for weird\n    (and possibly corrupted?) largo monorepos, so that --analyze can\n    complete (#602)\n  * Handle origin refs without an origin remote, for git-svn users (#171)\n  * Fix rare but problematic pruning of degenerate \"evil\" merges that\n    should not be pruned, and which caused some files to not be deleted\n    or not be introduced as expected (#261, #174, #313)\n  * Don't die if a repo uses refnames that look like git-describe output\n    and those refnames are pruned as part of the rewrite (#261)\n  * [insert-beginning contrib script] Add some sanity checks on the\n    passed filename (#260)\n  * Allow --path-rename arguments before --path arguments; don't require\n    them to always come after (#142, #182, #504)\n\n* Features\n  * add --no-gc option (#531)\n  * Rewrite the stash too, for all those users who insist on not making\n    a fresh clone (#115)\n  * add a --file-info-callback, allowing users to operate on the combination\n    of filename and file contents and file mode (addresses usecases such as\n    #74, #345, #464, #468, #509, #549, #597, and others; also kind of\n    obsoletes the lint-history contrib script)\n  * add tracking of First Changed Commit(s), meaning commits that were\n    rewritten whose parents were not rewritten, and write to\n    $GIT_DIR/filter-repo/first-changed-commits\n  * add recording of changed references, written to\n    $GIT_DIR/filter-repo/changed-refs\n  * add a --sensitive-data-removal flag/mode, to assist users trying to\n    expunge sensitive data from their repository.  This includes:\n      * automatically fetching refs other than branches and tags in case\n        those also reference the sensitive data (clone by default only fetches\nbranches and tags)\n      * not removing the origin remote, since users need to force push\n        back to it\n      * track and report on first changed commit(s), so that it can be\n        provided to others who need to expunge it from their clones or their\ngit server\n      * track whether and which LFS objects were orphaned by the rewrite, so\n        that LFS objects with sensitive data can also be deleted/purged from\nthe LFS server\n      * assistance in terms of next steps needed to ensure the sensitive data\n        is removed from other copies, including the force push command that\nshould be run\n\n* Usability -- improved notifications\n  * Provide warnings about filterability on subpar filesystems, e.g. when\n    refs differ in case only and doing filtering on a case-insensitive\n    filesystem (#48, #156, #325, #512, #566, #572)\n  * Notify users when we remove the origin remote\n  * Notice and signal if cleanup commands fail (#121)\n\n* Usability:\n  * Avoid the need to specify --force with git-replace, so we can more\n    universally recommend against the use of --force (#165)\n  * Prevent __pycache__ entry made by running git-filter-repo from triggering\n    the not-a-frash-clone-check (#522)\n  * Update commit-map and ref-map files (under $GIT_DIR/filter-repo) instead of\n    overwriting.  (See also under \"Fixes\" above about an \"already_ran\" file\n    that is older than a day.)\n    * Also, output commit-map and ref-map files in predictable orders\n\n* Documentation:\n  * Add a new and very detailed \"Sensitive Data Removal\" subsection in\n    the manual to cover the many special considerations facing folks who\n    need to try to remove sensitive data from a git repository and its\n    clones.\n  * Add a new large collection of example filterings based on user-filed\n    issues\n  * Add a new Frequently Answered Questions document\n  * fix some misleading statements\n  * clarify the purpose of the --tag-callback (#591)\n  * clarify docs for to-subdirectory-filter (#605)\n  * note additional default capabilities\n  * mention pipx as an alternative in installation instructions (#487)\n\n* Miscellaneous:\n  * Make testsuite work when running a version of git built against zlib-ng\n  * Make ref deletion output easier to scan through with --debug\n\n\n\nFull list of changes since v2.45.0 are as follows:\n\nAaron Cooper (1):\n      Reword to-subdirectory-filter help\n\nDavid Linke (2):\n      INSTALL.md: Mention pypi / pipx as install option\n      INSTALL.md: fix typo\n\nLars Schneider (1):\n      filter-repo: skip over unexpected git-catfile output\n\nSebastian Andrzej Siewior (1):\n      t9394: Mask compressed size for comparison.\n\nVladislav Javadov (1):\n      filter-repo: add --no-gc option\n\nElijah Newren (75):\n      Makefile: pypi overhauled their authentication stuff; update note\n      t9390: in sanity check tests, put temporaries outside test repo\n      filter-repo: fix misleading help message for --replace-message\n      filter-repo: add --proceed option to bypass no-args-specified check\n      filter-repo: Do not require --force when using git-replace\n      filter-repo: change the --replace-refs default to 'delete-no-add'\n      Bump python requirement to 3.6\n      filter-repo: notify users when we remove the origin remote\n      filter-repo: rewrite the stash too\n      filter-repo: avoid calling `git config` multiple times\n      filter-repo: provide warnings about filterability on subpar filesystems\n      filter-repo: notice and signal when cleanup commands fail\n      filter-repo: handle origin refs without origin remote\n      t9390: skip the version test if we are in some kind of installation\n      filter-repo: ignore __pycache__ untracked files for fresh clone check\n      filter-repo: clarify the purpose of the --tag-callback\n      pyproject.toml: mark filter-repo stable\n      git-filter-repo.txt: note additional default capabilities\n      git-filter-repo.txt: remove case specific explanation of commit-map file\n      git-filter-repo.txt: correct location of metadata files\n      filter-repo: make debug ref deletion output easier to scan through\n      filter-repo: add some clarifying comments about the purpose of\nthe _IDs class\n      filter-repo: explain data structures in AncestryGraph\n      filter-repo: fix gnarly bug in _IDs.record_rename\n      filter-repo: allow tracking commit hashes in AncestryGraph\n      filter-repo: fix bug in _IDs.__str__()\n      filter-repo: remove/rename ID_TO_HASH and HASH_TO_ID\n      filter-repo: fix some unfortunate local variable names\n      filter-repo: extract part of _record_metadata into a new function\n      t9390: add disgusting hack to --analyze test so it works with zlib-ng\n      filter-repo: only conditionally heed the already_ran file\n      filter-repo: output commit-map and ref-map in predictable orders\n      t9390: add a new test demonstrating problems with pruning of merges\n      filter-repo: update commit-map metadata file instead of overwriting\n      filter-repo: make purpose of trim_extra_parents clearer\n      filter-repo: start tracking new_id -> new_hash mapping as well\n      filter-repo: rename old_1st_parent -> prev_1st_parent\n      filter-repo: add a new _remap_to() convenience function\n      filter-repo: add explanatory note for complicated condition\n      filter-repo: add a new get_parent_hashes() convenience function\n      filter-repo: update ref-map metadata file instead of overwriting\n      filter-repo: fix corner case involving bad pruning of evil\ndegenerate merge\n      filter-repo: add tracking and recording of first changed commit(s)\n      filter-repo: limit searches for ref values to actual refs\n      filter-repo: avoid shadowing built-in names\n      filter-repo: determine files modified by callbacks *after* callbacks\n      t: restructure tests a bit\n      t9394: prefer 'python3' to 'python'\n      filter-repo: avoid parsing already_ran file multiple times\n      docs: correct a couple items in explanation of ref-map file\n      filter-repo: more thorough stash rewriting\n      filter-repo: add a --file-info-callback\n      git-filter-repo.txt: tweak the quoting\n      filter-repo: add --sensitive-data-removal flag\n      filter-repo: add special handling of origin for sensitive data removal\n      git-filter-repo.txt: add Sensitive Data Removal subsection\n      filter-repo: allow users to override automatic fetch forcing in --sdr\n      filter-repo: handle locally modified refs vs. automatic fetch of --sdr\n      t9393: add testcases for tracking orphaning of lfs objects\n      filter-repo: send blobs through RepoFilter._insert_into_stream()\n      filter-repo: add LFSObjectTracker class\n      filter-repo: set up data structures to track LFS objects\n      filter-repo: add necessary blob and commit investigation of LFS objects\n      filter-repo: report on and record LFS objects we find\n      filter-repo: for multi-run invocations, update LFS tracking information\n      filter-repo: handle LFS orphan tracking with partial history rewrites\n      git-filter-repo.txt: add details about orphaning of LFS objects\n      filter-repo: help users complete sensitive data removal; show next steps\n      filter-repo: provide a changed-refs metadata file as well\n      insert-beginning: add some sanity checking on the passed filename\n      examples-from-user-filed-issues.md: new collection of example filterings\n      filter-repo: also allow --path-rename arguments before --path arguments\n      FAQ.md: new file with frequently answered questions\n      INSTALL.md, README.md: make installation instructions less \"sassy\"\n      README.md: record latest git commits in support of git-filter-repo\n"}]}