9

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

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

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

4

4 回答 4

7

好的,所以我偶然发现了一些git-annex 的文档,它们提供了两个命令来实现我想要做的事情:

unannex [路径 ...]

使用它来撤消意外的 git Annex add 命令。您可以随时使用 git Annex unannex 将内容移出附件,即使您已经提交了它。如果您有意附加一个文件并且不再需要它的内容,这不是您应该使用的命令。在这种情况下,你应该使用 git Annex drop 代替,你也可以 git rm 文件。

初始化

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

我开始跑步git annex uninit,但我的上帝是它很慢。“取消附加”一个文件大约需要 5 分钟。我的文件系统树大约有 200,000 个文件,所以这是不可接受的。

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

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

于 2014-06-28T06:39:15.227 回答
3

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

我没有附加完整的存储库,但只有大约 40 个更大的文件。在确定我没有使用git-annex. 然后,我跑了git annex uninit,只花了一分钟多的时间来处理非常大的文件(超过几 GB)。总的来说,它在大约 20 分钟内完成,这在我的情况下是可以接受的。

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

于 2014-07-14T12:13:40.827 回答
3

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

git unnannex . --fast

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

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

请参阅官方升级指南

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

于 2018-12-16T09:10:07.160 回答
2

你试过在直接模式下使用 git-annex 吗?

只需更改您的存储库

git annex direct

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

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

于 2015-04-12T14:43:51.883 回答