top
This commit is contained in:
parent
41cad8d9aa
commit
990b7bc3ef
2 changed files with 61 additions and 0 deletions
|
@ -0,0 +1,8 @@
|
||||||
|
[[!comment format=mdwn
|
||||||
|
username="joey"
|
||||||
|
subject="""comment 5"""
|
||||||
|
date="2024-02-10T16:49:33Z"
|
||||||
|
content="""
|
||||||
|
Wrote up a tip with an even more polished version of that,
|
||||||
|
[[tips/redacting_history_by_converting_git_files_to_annexed]]
|
||||||
|
"""]]
|
|
@ -0,0 +1,53 @@
|
||||||
|
git-annex can be used to let people clone a repository, without being
|
||||||
|
able to access the content of annexed files whose content you want to keep
|
||||||
|
private.
|
||||||
|
|
||||||
|
But what to do if you're using a repository like that, and accidentially
|
||||||
|
add a file to git that you intended to keep private? And you didn't notice
|
||||||
|
for a while and made other changes.
|
||||||
|
|
||||||
|
Here's a way to recover from that mistake without throwing away the commits
|
||||||
|
you made. It creates a separate, redacted history where the private
|
||||||
|
file (`$privatefile`) is an annexed file. And uses `git replace` to let you
|
||||||
|
locally keep using the unredacted history.
|
||||||
|
|
||||||
|
Start by identifiying the parent commit of the commit that added the
|
||||||
|
private file to git (`$lastsafecommit`).
|
||||||
|
|
||||||
|
Reset back to `$lastsafecommit` and squash in all changes made since then:
|
||||||
|
|
||||||
|
git branch unredacted-master master
|
||||||
|
git reset --hard $lastsafecommit
|
||||||
|
git merge --squash unredacted-master
|
||||||
|
|
||||||
|
Then convert `$privatefile` to an annexed file:
|
||||||
|
|
||||||
|
git rm --cached $privatefile
|
||||||
|
git annex add --force-large $privatefile
|
||||||
|
|
||||||
|
Commit the redacted version of master, and locally replace it with your
|
||||||
|
original unredacted history.
|
||||||
|
|
||||||
|
git commit
|
||||||
|
git replace master unredacted-master
|
||||||
|
|
||||||
|
Now you can push master to other remotes, and it will push the redacted
|
||||||
|
form of master:
|
||||||
|
|
||||||
|
git push --force origin master
|
||||||
|
|
||||||
|
(Note that, if you already pushed the unredacted commits to origin, this
|
||||||
|
push will not necessarily completely delete the private content from it.
|
||||||
|
Making a new origin repo and pushing to that is an easy way to be sure.)
|
||||||
|
|
||||||
|
If you do want to share the unredacted history with any other repositories,
|
||||||
|
you can, by fetching the replacement refs into them:
|
||||||
|
|
||||||
|
git fetch myhost:myrepo 'refs/replace/*'
|
||||||
|
git fetch myhost:myrepo unredacted-master
|
||||||
|
git replace master unredacted-master
|
||||||
|
|
||||||
|
Note that the above example makes the redacted history contain a single
|
||||||
|
squashed commit, but this technique is not limited to that. You can make
|
||||||
|
redacted versions of individual commits too, and build up whatever form of
|
||||||
|
redacted history you want to publish.
|
Loading…
Add table
Add a link
Reference in a new issue