相关疑难解决方法(0)

Git如何处理blob上的SHA-1冲突?

这可能永远不会发生在现实世界中,并且可能永远不会发生,但让我们考虑一下:假设您有一个git存储库,进行提交,并且变得非常不幸:其中一个blob最终拥有相同的SHA-1另一个已存在于您的存储库中.问题是,Git将如何处理这个?简直失败了?找到一种方法来链接两个blob并根据上下文检查哪一个需要?

更多的是脑筋急转弯而非实际问题,但我发现这个问题很有趣.

git hash-collision

527
推荐指数
6
解决办法
7万
查看次数

git中的哈希冲突

如果我在使用git时遇到哈希冲突会发生什么?

例如,我设法提交两个具有相同sha1校验和的文件,git会注意到它还是损坏了其中一个文件?

可以改进git以适应它,或者我是否必须更改为新的哈希算法?

(请不要通过讨论这个问题来转移这个问题 - 谢谢)

git hash sha1 hash-collision

162
推荐指数
6
解决办法
4万
查看次数

剥离在Git中意味着什么?

在尝试理解与git提交相关联的JGit:Retrieve标签时,我到达了JGit邮件列表上的这个线程: [jgit-dev]提交和标记.

在这个线程中,他们引用的peel方法org.eclipse.jgit.lib.Repository:

剥离对带注释标签的可能没有剥离的引用.

我只能在Git文档中找到两个剥离提示:git-check-ref-format(1)Manual PageGit Internals - 维护和数据恢复.

剥离术语在Git中意味着什么?它有用吗?它与洋葱有什么关系?

git

9
推荐指数
2
解决办法
1984
查看次数

提交签名如何工作?

我目前想知道git commit签名是如何工作的.

试图找到这个,但找不到任何确切的技术文档.我知道如何进行git commit签名,但我想知道git在签名提交时究竟做了什么.

究竟是什么签署?它是给定提交中存储库内的完整数据,所以提交消息等数据和所有文件的数据?或者只是提交指向包含的文件等?

git signing git-commit

9
推荐指数
2
解决办法
685
查看次数

重写 Git 历史记录时保留提交哈希值的肮脏技巧?

注意:有一个类似的问题How to keep commit hashs not change when use git filter-repo rewrite the History,但答案集中在Git如何不能做到这一点上。在这个问题中,我想探讨理论上是否可以编写自定义脚本来保留提交哈希值。

Gitfilter-branchBFG Repo-Cleaner是两种流行的工具,用于从存储库历史记录中删除大文件和其他内容。它们导致不同的提交 SHA/散列,这就是 Git 的工作方式,因为它“指纹”提交的内容、其父项等。

然而,我们面临的情况是,不久前发生了不幸的大文件提交,并且我们有各种对较新提交的引用,例如在 GitHub 问题(“参见提交 f0ec467”)和其他外部系统中。如果我们使用过滤器分支或 BFG,很多东西都会被破坏。

所以我来这里询问是否有一些肮脏的、低级的技巧如何保留提交 ID / SHA-1,即使是重写提交。我想,对于我们想要重写的错误提交,自定义脚本将创建一个新的 Git 对象,但“硬编码”相同/旧的 SHA-1,跳过它的计算。我认为较新的提交(其子级/后代)应该继续工作(?!)。

如果这行不通,我想了解为什么。Git 是否定期检查哈希值是否与实际内容一致?它是否仅在某些操作(例如gc推或拉)期间执行此操作?

(我知道这是一个非常薄冰的情况,在我们接受我们将永远在我们的仓库中拥有一个大型二进制文件之前,我只是在技术上探索我们的选择,其所有影响包括永远拥有更大的备份,完整克隆需要更长的时间, ETC。)


更新:现在有一个被接受的答案,但与此同时,没有答案提到git replace这可能是解决方案?我已经做了一些基本实验,但还不确定。

git

8
推荐指数
1
解决办法
1645
查看次数

你可以从另一个分支中存在的分支中删除Git提交,就像提交的"交集"一样吗?

我有时会发现自己处于简单的情况,我正在进行一些更改并创建一个分支.当我在我的变化中移动时,我开始发现需要清理的一些事情或者我想要开始进入的一些其他部分相关的事情.所以,我想保持特定的分支,所以我快速分离另一个分支,开始处理可能与前一个分支没有相同依赖关系的另一组更改.最后,我最终得到了两个分支,我试图隔离这些变化,但是,这个第二个分支起源于第一个分支,其中术语来自"主".

我可以(并且已经)通过将'master'合并到每个分支中来单独更新每个分支,并且希望将第二个分支准备好合并到'master'中,因为它具有比创建的第一个分支更少的依赖性.但是,此分支还包含自第一个分支分离后所做的更改.

所以我想知道,有没有办法告诉Git类似:"删除这个其他分支中存在的所有提交"这样我就离开了我的第二个分支而没有在第一个分支中完成所有更改,允许我将第二个分支合并为"master",让我回到我创建的第一个分支上工作.

我可能只是在Git中找不到合适的术语,看看它是如何做到的.但是,也许它不能.看起来它应该是非常可行的,看看Git如何很好地向我展示分支1和2之间的适当差异,即使在我从'master'单独更新两个分支之后也是如此.

并且从分支中"删除"是没有必要的..即使这个想法正在创建另一个分支但是仍然以某种方式排除在第一个分支中也在第二个分支中完成的更改就足够了.

git branching-and-merging

5
推荐指数
2
解决办法
895
查看次数

如何更改Git标签的Tagger名称和电子邮件

长话短说,我正在编写一个脚本,将一个非常大的项目从(gasp)Microsoft SourceSafe迁移到Git,并且我试图保留SourceSafe项目标签的作者(这些标签实际上是Git中的标签)。我知道您可以修改Git提交的作者和提交者名称/日期,但是您可以对Git标签做同样的事情吗?

git github visual-sourcesafe-2005 git-tag gitlab

4
推荐指数
2
解决办法
762
查看次数

我可以在 git 存储库中签出“无内容”吗?

假设我有一个 git 存储库,在某些分支上工作,并且在某些时候我不想签出任何分支。我可以这样做吗?

换句话说,我可以git clone path-to-repo --no-checkout在现有存储库上获得 , 但的效果吗?

编辑:实际上,如果主分支文件不显示为已删除,那就更好了。因此,理想的答案并不git clone--no-checkout.

注意:如果您的建议需要最新版本的 git,请说明。

git checkout

4
推荐指数
1
解决办法
1369
查看次数

Git backmerges/rebases并承诺Git分支"知道"

我曾多次听到Git保留了"它所知道的变化"的内部记录.这通常是为什么我们需要将更改(比如登台到修改程序的修补程序)或重新定位中固有的问题重新编写.我觉得这就像"一流的对象",其中使用的短语有点含糊不清并且松散地使用,并且潜在的现实更为直接.

那么"它所知道的变化"到底意味着什么呢?在Git源代码中,每个分支都维护一个sha1的列表,它"知道"(可能在这里:https://github.com/git/git/blob/master/commit-graph.c)?当Git更改sha1时会发生什么 - 例如,说发布分支上的某个人做了a,b,c的壁球提交来制作d?

发布分支是否知道a,b,c,并且在合并回dev时它是否也会传递该信息或仅存在d?如果dev分支已经提交了一个 - 它是否足够智能来同时管理d和a的存在?

git

3
推荐指数
1
解决办法
68
查看次数

git diff 没有差异,但由于行结尾的改变,不应该有一些差异吗?

我的问题可能来自于对 Git 某些方面的误解。当我因 Windows 机器上的更改而在 Mac 上将 CRLF 更改为 LF 行结尾时,我想到了这个问题。

1) 我首先在 OSX 上初始化一个新存储库,并将所有文件放入受 CRLF 行结尾影响的文件中。

2)第一次提交,由于设置了 core.autocrlf = input ,git 自动将行结尾更改为 LF

我的本地工作树中的文件仍然具有 CRLF 行结尾,但这里也提供了解决方案(How to Normalizeworking tree lineendings in Git?):

删除Index中的文件,并根据上次commit恢复索引+工作树:

git rm --cached -r .
git reset --hard
Run Code Online (Sandbox Code Playgroud)

现在出现了混乱:我的第一个提交 1) 包含转换后的 LF 行结尾,而我的本地树和索引则不包含。因此,我的期望是 git 应该显示工作树/索引和存储库之间的差异。但

git diff HEAD
git diff --chached
Run Code Online (Sandbox Code Playgroud)

没有列出任何更改?

git

3
推荐指数
1
解决办法
1239
查看次数