从文件树中删除git-annex存储库

时间:2014-06-27 08:13:39

标签: linux git symlink git-annex

我昨天尝试安装git-annex来备份我的文件。我在我的存储库树的根目录中运行git annex add .,然后运行git commit。到目前为止一切都很好。

我不知道git-annex正在做的是将我的整个文件树变成一大堆符号链接。我整个树中的每个文件现在都符号链接到.git/annex/objects!这搞乱了我的应用程序,这取决于文件不是符号链接。

我的问题是,如何摆脱git-annex并将我的文件系统恢复到原始状态?对于正常的git repo,我可以做rm -r .git,但我担心这不会在git-annex中完成。提前谢谢。

4 个答案:

答案 0 :(得分:5)

好的,所以我偶然发现了一些docs for git-annex,他们给出了两个命令来实现我想做的事情:

  

unannex [路径...]

     

使用它来撤消意外的git annex add命令。您可以使用git annex unannex在任何时候将内容移出附件,即使您已经提交了内容。   如果您故意附加文件并且不再需要其内容,那么这不是您应该使用的命令。在这种情况下,你应该使用git annex drop,你也可以git rm文件。

     

<强> UNINIT

     

使用它来停止使用git附件。它将取消存储库中的每个文件,并删除所有git-annex的其他数据,留下git存储库以及之前附加的文件。

我开始跑git annex uninit,但我的上帝很慢。 “unannex”只花了大约5分钟就完成了一个文件。我的文件系统树大约有200,000个文件,所以这是不可接受的。

我最终做的事实上非常简单并且运作良好。我使用cp -rL标志自动复制文件树的内容并反转复制副本中的所有符号链接。而且速度非常快:整个文件树大约需要30秒。唯一的问题是文件权限未从原始状态保留,因此我需要运行一些chmodchcon命令来修复权限。

第二种方法对我有用,因为我的架构中没有其他符号链接。如果您的架构中的符号链接超出了git-annex创建的符号链接,那么我的小快捷方式可能不是您的正确选择,您应该考虑坚持使用git annex uninit

答案 1 :(得分:3)

除了OP的回答之外,我想包括我自己使用git annex uninit的经验。

我没有完整的存储库附件,但只有大约40个更大的文件。在确定使用git-annex没有特别好处之后,我尝试了几个文件的异常删除,并且每个文件在几秒钟内结束。然后,我运行了git annex uninit,只花了一分钟以上才发现真正庞大的文件(超过几GB)。总的来说,这是在大约20分钟内完成的,这在我的案例中是可以接受的。

因此,似乎unannexing的复杂性随着附件文件树的大小而增加。

答案 2 :(得分:1)

您是否尝试在直接模式下使用git-annex?

只需使用

更改存储库即可
git annex direct

这将再使用符号链接,但某些git命令不适用于此类附件存储库。 查看他们网站上的解释,看看这个方案是否符合您的目的。

也许转换过程比之前提到的提示更快。 我没有自己尝试使用大型存储库。

答案 3 :(得分:1)

如果您拥有v6存储库,则可以执行以下操作:

git unnannex . --fast

用硬链接替换符号链接,而不是用原始文件再次缓慢替换符号链接。

只有v6存储库可以对未提交的更改执行git-annex unannex命令,因此可能需要将git-annex存储库升级到v6存储库。

请参见Official Upgrade Guide

就我而言,我必须升级v5-> v6,而只需要执行 git annex upgrade 花费了几秒钟,我就完成了。