Accidentally committed a large amount of raw data

2019-02-17 00:54发布

I copied a large amount of data from my labs file server to my laptop, then accidentally committed it to the Mercurial repository I'm using to back up my thesis.

Now I have 200+ MB of data I don't need taking up space on my hard disk, even after I've deleted the files. This isn't really a problem, but the bitbucket repository I sync to only gives me 1 GB of space, which I will need for my data.

Stupidly I then deleted the files and committed again, so I can't just use rollback as described in https://stackoverflow.com/a/3290523/961959 without creating a new repository and having to reset up everything with bitbucket.

Is there a way I can fix this, so I don't waste a quarter of my repository space? Can I rollback the last 2 commits I did?

3条回答
聊天终结者
2楼-- · 2019-02-17 01:22

In case the changes are already pushed to BitBucket, it does offer an option to strip changesets from the server. After performing the strip locally, you should access the url:

https://bitbucket.org/<user>/<repo>/admin/strip

It'll offer an option to strip all changes following a specific commit.

NOTE: There used to be a link to reach that URL in the repo config menu. Now the only way to access it seems to be typing it directly.

查看更多
三岁会撩人
3楼-- · 2019-02-17 01:42

I'm going to describe what I would do if I wanted to roll back two most recent commits.

I assume that you haven't pushed to Bitbucked yet. I also assume you have these changesets on top of your DAG:

o  C: Deleted files FILE1 and FILE2
|
o  B: Some nice changes; also added large files FILE1 and FILE2
|
o  A: Some good changeset

Here, C should be removed altogether, B should be edited (FILE1 and FILE2 additions should be rolled back), and A and below should be left as they are.

Caveat: this only works if B and C were not pushed onto Bitbucked (or any other public repo) yet.

You'll need to enable the MQ extension to do this. To do this, add these lines to the .hg/hgrc file in your repo:

[extensions]
mq=

Steps

First, I strip C:

$ hg strip C

Now, C is obliterated, and the parent is B. I import B as a Mercurial Queues patch to edit it:

$ hg qimport -r B -n B.patch

Now I have one patch on top our queue, which was created from B. I remove the big files, and refresh the patch:

$ hg forget FILE1 FILE2 
$ hg qrefresh

Now B.patch no longer includes the big files. However, they are still on the disk, albeit not controlled bu Mercurial. I now finish my work with MQ:

$ hg qfinish -a

Here's what I have at the moment:

o  B1: Some nice changes, no big files here
|
o  A: Some good changeset
查看更多
Evening l夕情丶
4楼-- · 2019-02-17 01:44

You can:

  1. Use hg strip to remove the changeset where you've added the files and all of its descendants (note that this will obliterate them completely, so only do it if these files are the only thing committed during this time).
  2. Import those changesets to MQ and edit them.
  3. Use hg convert from Mercurial to Mercurial with --filemap option.
  4. Clone your repository up to faulty changeset and push from this one instead, as described in FAQ.
查看更多
登录 后发表回答