如何git push reflog?

8

有办法将Reflog推送到远程吗?这似乎是一个非常有用的事情,但我不知道如何做到。 我想象了一些像git push --include-reflogs这样的东西

最终,我希望远程有一个Reflog的逐字副本在推送时刻

我尝试使用--mirror,但是1)我不想从特定远程删除任何分支,只能手动删除,2)它仍然没有将Reflog复制到远程

是否有人知道如何做到这一点?


git reflog 显示分支尖端的更改。由于 Git 是一种分布式版本控制系统,这些更改在不同的存储库中会有所不同。我不确定您如何推送它们。它们会覆盖远程 reflogs 吗? - Klas Mellbourn
目的是为了备份。如果我的硬盘驱动器损坏,我仍然有我的 reflog,这样我就可以得到最接近上次推送时的确切状态。 - Alexander Bird
这就是硬盘备份的用途! - NightOwl888
3个回答

10

您真正询问的是,是否有一种方法可以备份匿名(即未引用)的提交对象及其树和基本对象。答案是否定的。匿名对象——仅由您的引用日志引用的对象——是本地存储库中私有的。

但是——您只需复制任何存储库的.git目录即可实现您想要的功能。如果源存储库正在忙碌(例如正在进行提交,垃圾回收或重新打包),那么您需要按照特定的顺序复制.git目录中的文件和目录。这在各个地方都有解释,但其中一个例子是http://article.gmane.org/gmane.comp.version-control.git/147354(“如果您希望您的rsync备份正常,请遵循一些排序规则...”)


3

您可以备份.git/logs,这将备份提交的引用(但不包括提交或文件本身)。

实际上,git将reflog信息存储在.git/log目录下,您可以像打开此目录中的文本编辑器中的文件一样对它们进行任何操作。如果您删除此目录,则所有reflog都会消失,如果您恢复它,则reflog将回来。

据我所知,没有内置的方法来跟踪.git/logs。我尝试将.git/log移动到工作目录,并从.git目录创建符号链接。它可以工作,但效果不是很好,因为每次提交时,HEAD会移动并且.git/logs/HEAD会更改,然后您现在有一个未提交的更改。工作目录永远不会干净。


-1: .git/logs 目录只包含对提交的引用,而非提交或文件本身。 仅备份此目录与备份桌面快捷方式一样没有意义。 Reflog 保留最近过去作为 HEAD 的提交的引用(因此名称),以便它们不会变得未引用(悬空),然后被垃圾回收。 即使您没有 reflog,如果提交尚未被 GC,则可以通过 git fsck 恢复丢失的提交。 您可以在 Pro Git 中找到详细信息:http://git-scm.com/book/en/v2/Git-Internals-Maintenance-and-Data-Recovery - user
@user 备份快捷方式并不是什么邪恶的事情,OP 需要的正是备份快捷方式而不是提交(这已经被 Git 完成了)。而 reflog 并不是为了防止未引用的提交,因为你可以在当前 HEAD 或分支头的祖先树中找到它们,它只是一个 日志 - dyng
复制指向对象的快捷方式没有任何意义。Git仅推送从分支可达的那些对象。您错过了reflog的整个要点:在它们从可用分支中删除后,使对象在有限时间内可访问。而那些悬空的对象不会发送到服务器,因为它们不属于任何分支。 - user
@user 我明白了你的意思,并同意你所说的reflog可以使对象在意外删除后可达(这为我节省了很多时间),但我也将reflog用作检出历史记录,认为那是OP所要表达的意思(也许不完全正确)。但是无论如何,对于这两种用途,我赞同完全复制.git可能更好。 - dyng

0

Git reflog 跟踪单个 Git 存储库的 HEAD 更改。每个克隆都有自己的 reflog。 我无法想象你会如何使用共享的 reflog(远程帮助别人?)

如果您真的需要跟踪某人的 reflog,您可以使用 git reflog > dev1_reflog.txt 将 reflog 内容转储到文件中,并共享 dev1_reflog.txt(使用 git add dev1_reflog.txt; git commit -m "Adding dev1_reflog"; git push)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接