Obliterating a commit

3 messages, 2 authors, 2016-06-15 · open the first message on its own page

Obliterating a commit

From: Wincent Colaiuta <hidden>
Date: 2016-06-15 22:43:37

A couple of days ago I mistakenly checked in a file that had some  
confidential information in it. I immediately realized and amended my  
commit, and this is a local repository whose contents won't be  
visible until I push them out.

So how do I *really* get rid of the that commit before publishing? I  
couldn't find any porcelain or plumbing to do this. Do I have to  
manually destroy it? ie. wind back the HEAD, manually remove the  
commit object, the corresponding tree object, the corresponding file  
blobs, and probably manually remove the entry from the reflog as well?

Is there a "shortcut" wherein I can somehow mark this commit and its  
related tree and file blobs as unreachable, and then use git-prune to  
erradicate them?

Cheers,
Wincent

Re: Obliterating a commit

From: Matthias Kestenholz <hidden>
Date: 2016-06-15 22:43:37

Hello,

2007/9/30, Wincent Colaiuta [off-list ref]:
A couple of days ago I mistakenly checked in a file that had some
confidential information in it. I immediately realized and amended my
commit, and this is a local repository whose contents won't be
visible until I push them out.

So how do I *really* get rid of the that commit before publishing? I
couldn't find any porcelain or plumbing to do this. Do I have to
manually destroy it? ie. wind back the HEAD, manually remove the
commit object, the corresponding tree object, the corresponding file
blobs, and probably manually remove the entry from the reflog as well?
If you use ssh to push your changes (that is, you are not copying
or rsyncing packfiles), only commits, trees and blobs, which are reachable
through the DAG will be published. Commits and Blobs which are only
reachable through your reflog are not published, since the reflog only applies
to your local repository.

The simplest thing you could do is remove the reflog for HEAD and
refs/heads/master respectively your current branch and run 'git prune'
afterwards (if you have not repacked
already, otherwise you'd need to run 'git repack -a -d' or 'git gc' to get
rid of blobs inside your packfile.
Is there a "shortcut" wherein I can somehow mark this commit and its
related tree and file blobs as unreachable, and then use git-prune to
erradicate them?
You don't need to mark anything -- it's sufficient that the blob with the
confidential information is only reachable through the reflog (which you
need to remove, obviously, if you want to get rid of the blob locally too)


Cheers,
Matthias

Re: Obliterating a commit

From: Wincent Colaiuta <hidden>
Date: 2016-06-15 22:43:37

El 30/9/2007, a las 14:15, Matthias Kestenholz escribió:
If you use ssh to push your changes (that is, you are not copying
or rsyncing packfiles), only commits, trees and blobs, which are  
reachable
through the DAG will be published. Commits and Blobs which are only
reachable through your reflog are not published, since the reflog  
only applies
to your local repository.
Ah, this is good to know. Yes, I do principally publish by pushing to  
a central repo, but I wanted to really destroy the objects just in  
case in the future I or somebody else ever clones my local repo.
The simplest thing you could do is remove the reflog for HEAD and
refs/heads/master respectively your current branch and run 'git prune'
afterwards (if you have not repacked
already, otherwise you'd need to run 'git repack -a -d' or 'git gc'  
to get
rid of blobs inside your packfile.
Thanks very much, Matthias. Blowing away those reflogs and running  
git-prune worked and it's doesn't require too much fiddling.

Cheers,
Wincent
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help