我昨天尝试安装git-annex来备份我的文件。我在我的存储库树的根目录中运行git annex add .
,然后运行git commit
。到目前为止一切都很好。
我不知道git-annex正在做的是将我的整个文件树变成一大堆符号链接。我整个树中的每个文件现在都符号链接到.git/annex/objects
!这搞乱了我的应用程序,这取决于文件不是符号链接。
我的问题是,如何摆脱git-annex并将我的文件系统恢复到原始状态?对于正常的git repo,我可以做rm -r .git
,但我担心这不会在git-annex中完成。提前谢谢。
答案 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秒。唯一的问题是文件权限未从原始状态保留,因此我需要运行一些chmod
和chcon
命令来修复权限。
第二种方法对我有用,因为我的架构中没有其他符号链接。如果您的架构中的符号链接超出了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存储库。
就我而言,我必须升级v5-> v6,而只需要执行
git annex upgrade
花费了几秒钟,我就完成了。