我正在寻找关于悬挂提交和blob的基本信息.
我的回购似乎很好.但是我git fsck
第一次跑去看看它做了什么,我有一长串的'悬空blob'和一个'悬挂提交'.
这些是什么东西?哪儿来的?他们是否表明我的回购状态有什么异常(好的或坏的)?
在我的本地机器上,我从文件夹中删除了文件
git init
git add --all
Run Code Online (Sandbox Code Playgroud)
然后我写了(不要问我,为什么!:))
git rm -rf
Run Code Online (Sandbox Code Playgroud)
我还没有承诺.现在我的项目中有空文件夹.在.git
文件夹中objects
有53 Mb的文件.
我该如何恢复我的文件?我尝试过Drill Disc和Stellar等程序,但没找到我的文件.我无法从GIT回滚.
如何恢复丢失的文件?
我的电脑突然关机了,现在我工作的项目的 Git 存储库有缺陷。我安装了 Git 2.20.1。我立即创建了项目文件夹的备份副本以使用原始文件夹。我有当地的分支机构,我不想松散。
$ git status
error: object file .git/objects/c7/8e67bcad2ea132e3df8f80bb42b4804ab4f2a3 is empty
fatal: loose object c78e67bcad2ea132e3df8f80bb42b4804ab4f2a3 (stored in .git/objects/c7/8e67bcad2ea132e3df8f80bb42b4804ab4f2a3) is corrupt
Run Code Online (Sandbox Code Playgroud)
短路输出:
$ git fsck --name-objects
error: object file .git/objects/04/f338bf0dc0770b841b291af6cdd4c9130edb84 is empty
error: unable to mmap .git/objects/04/f338bf0dc0770b841b291af6cdd4c9130edb84: No such file or directory
error: 04f338bf0dc0770b841b291af6cdd4c9130edb84: object corrupt or missing: .git/objects/04/f338bf0dc0770b841b291af6cdd4c9130edb84
error: object file .git/objects/2e/07479ec010e5b459387d841a576e1ead97f850 is empty
error: unable to mmap .git/objects/2e/07479ec010e5b459387d841a576e1ead97f850: No such file or directory
error: 2e07479ec010e5b459387d841a576e1ead97f850: object corrupt or missing: .git/objects/2e/07479ec010e5b459387d841a576e1ead97f850
error: object file .git/objects/34/b03409d09382c44f50409e4388850ca9c82c77 …
Run Code Online (Sandbox Code Playgroud) 假设我想编写一个小助手,它允许将一些元数据附加到存储库中,这种方式可以通过refs
. 简单示例(一个git-notes克隆原型,甚至不将注释附加到任何其他 git 对象):
hash=$(echo "Just a comment" | git hash-object -w --stdin)
git update-ref refs/comments/just $hash
Run Code Online (Sandbox Code Playgroud)
即我blob
用哈希创建一个hash
并引用它,因为refs/comments/just
这样git fsck --unreachable
不会抱怨它,git gc
也永远不会prune
是对象。
但这当然是一个非常简单的例子,实际上我对更复杂的功能感兴趣。在那里,我的问题是,我可以“合法”做什么,我绝对应该避免什么?
例如,SE 上的一些帖子是关于用户必须从重复tree
条目中恢复的。因此,“不要”就是“不要创建tree
具有重复条目的条目”。另一个例子是“你确保你的对象是可到达的,所以git prune
不会删除它们。” 还有什么?
我可以创建自定义对象类型吗?对树中的 blob 使用“无效”文件模式?在哪里可以找到概览?或者我应该git-fsck
手动检查's source 以查看什么构成错误(哪些是可以忽略的)?
我的全局Git配置中有以下设置:
[transfer]
fsckobjects = true
[fetch]
fsckobjects = true
[receive]
fsckobjects = true
Run Code Online (Sandbox Code Playgroud)
这些验证克隆数据库中的所有对象都是有效且可访问的.
但是,我想检查的一些回购有错误,例如oh-my-zsh
:
git clone https://github.com/robbyrussell/oh-my-zsh.git .oh-my-zsh
Cloning into '.oh-my-zsh'...
remote: Counting objects: 15624, done.
error: object 2b7227859263b6aabcc28355b0b994995b7148b6: zeroPaddedFilemode: contains zero-padded file modes
fatal: Error in object
fatal: index-pack failed
Run Code Online (Sandbox Code Playgroud)
有没有办法可以覆盖单个"git clone"操作的全局fsckobjects设置?
Git 的文档谈论“悬空”对象,而文档fsck
只谈论“gc
松散的对象”。有严格的划分。
但是,在浏览一些相关的 SO 帖子时,这些术语似乎可以互换使用。在Git Book v2和 Git 的源代码中也是如此:
(main) $ git checkout v2.33.0
(225bc32) $ rg 'dangling (object|commit|blob|tag|tree)' | wc -l
31
(225bc32) $ rg 'loose (object|commit|blob|tag|tree)' | wc -l
117
Run Code Online (Sandbox Code Playgroud)
最后,这两个命令经常按顺序使用,从它们的行为中我可以清楚地看出它们的目标是相同的。
因此,“悬空”和“松散”只是同一概念的两个相似术语。这个总结正确吗?
或者“松散的物体”是一个类别,而“悬空”是故意为特定类型的物体保留的?
tl; dr:是否可以恢复HEAD^
树,如果它被删除而不是事先推送,如果其他一切都完好无损?
我不小心删掉了部分内容.git
.我不完全确定缺少什么.
在发现git push
不起作用后,我跑了一个git fsck
:
Checking object directories: 100% (256/256), done.
Checking objects: 100% (1265/1265), done.
broken link from commit f3419f630546ba02baf43f4ca760b02c0f4a0e6d
to tree 29616dfefd2bff59b7fb3177e99b4a1efc7132fa
broken link from commit ccfe9502e24d2b5195008005d83155197a2dca25
to tree 0580c3675560cbfd3f989878a9524e35f53f08e9
broken link from commit ccfe9502e24d2b5195008005d83155197a2dca25
to commit 0bca9b3a9f1dd9106922f5b4ec59cdc00dd6c049
broken link from tree 6d33d35870281340c7c2f86c6d48c8f133b836bb
to blob 226d8a10a623acd943bb8eddd080a5929f3ccb2c
broken link from commit db238d4a52ee8f18a04c038809bc6587d7643438
to tree 0b69ab3f6940a04684ee8c0c423ae7da89de749c
missing tree 0580c3675560cbfd3f989878a9524e35f53f08e9
dangling commit 05512f9ac09d932e7d9a11d490c8a2f117c0ca11
missing tree 29616dfefd2bff59b7fb3177e99b4a1efc7132fa
dangling commit 578464dde7d7b8628f77e536b4076cfa491d7602
missing blob …
Run Code Online (Sandbox Code Playgroud) 概述:
我无法成功将我们的仓库中的更改提取到生产服务器.
在我的repo上运行"git fsck"返回了同样错误的5个实例:
warning in tree [hash]: contains entries pointing to a null sha1
Run Code Online (Sandbox Code Playgroud)
我们的所有版本的repo都存在错误,包括bitbucket上托管的版本.
我和我的同事在我们非常希望保留的本地版本的回购中都有未经删除和未提交的更改.
我已经尝试了google,stackoverflow和man page,但是我找不到一个好的指南来解释发生了什么或如何解决问题.
在谈到GIT时,我的同事和我是相对的新手.我们已经掌握了基础知识,但我们还没有在低级命令中花费任何时间.
我很感激任何和所有帮助恢复我的回购的完整性.
详细说明:
当我尝试将远程分支拉到生产服务器时,我的问题就出现了.它应该是对工作目录的简单更新,但我得到一些模糊的错误,我不记得,发现我的工作目录已损坏.
合并失败后,Git状态报告了大量未跟踪和修改的文件.我无法弄清楚如何使用git命令解决问题所以我手动操作文件系统以删除文件(但我没有触及.git目录中的任何内容)并让我的工作目录回到我的状态生产服务器将无误地为我的网站服务.
在我的repo上运行"git fsck"返回了同样错误的5个实例:
warning in tree [hash]: contains entries pointing to a null sha1
Run Code Online (Sandbox Code Playgroud)
我跑了git fsck:
我试过的一切都显示出相同的警告.所以无论问题是什么,它都在我们的回购的所有版本中.
调用"git ls-tree [树形哈希报告错误]"显示正常的目录打印输出以及坏树哈希:
160000 commit 0000000000000000000000000000000000000000 [name of repo]
Run Code Online (Sandbox Code Playgroud)
我找到的最接近解决方案的是这个stackoverflow帖子:如何在Git树中删除带有null sha1的条目.但是,我无法真正理解这些步骤,切割和粘贴命令无法解决我的问题.
我的问题:
我最近尝试将存储库导入 GitHub(来自 Bitbucket),但导入失败。GitHub 技术支持通知我,他们在存储库中发现了“错误日期”问题,我应该git fsck
在存储库上运行。所以我从 BitBucket 克隆它并运行git fsck
,这就是我得到的:
git fsck Checking object directories: 100% (256/256), done.
error in commit fda45b4b6b06f6b815341c1f26de827c769f48b6: badDate: invalid
author/committer line - bad date error in commit
636d259fd0ac343af2a5561ff799a54a6aeb9b1c: badDate: invalid
author/committer line - bad date error in commit
41dc786816992e3c42c904e8c848aa1078475386: badDate: invalid
author/committer line - bad date error in commit
c55a0fa0d98e02aa4621be202d7b7d21ed2ff2ab: badDate: invalid
author/committer line - bad date error in commit
e6ad8f5ea7cf6441b6ea6ab5583117113a8f49fb: badDate: invalid
author/committer line - bad date error in commit
4aea97fdd999484319a9fbbc4dc42b024e1eba80: badDate: …
Run Code Online (Sandbox Code Playgroud) 我git gc
在存储库中运行并收到致命错误:
Enumerating objects: 2382, done.
Counting objects: 100% (2382/2382), done.
Delta compression using up to 8 threads
Compressing objects: 100% (747/747), done.
fatal: unable to read <object-id>
fatal: failed to run repack
Run Code Online (Sandbox Code Playgroud)
运行git fsck --full --no-dangling
提供了有关该对象问题的更多详细信息:
Checking object directories: 100% (256/256), done.
Checking objects: 100% (2381/2381), done.
error: <object-id>: invalid sha1 pointer in resolve-undo
Verifying commits in commit graph: 100% (287/287), done.
Run Code Online (Sandbox Code Playgroud)
我相信这是由已修复的错误引起的:
索引中的解析-撤消信息不受 GC 保护,这一问题已在 Git 2.38(2022 年第 3 季度)中得到纠正。
如果我的存储库已经处于这种状态,我该如何修复它?
git ×11
git-fsck ×11
git-gc ×2
git-plumbing ×2
corruption ×1
git-commit ×1
git-dangling ×1
git-hash ×1
git-index ×1
git-refspec ×1
git-rm ×1