如果我在使用git时遇到哈希冲突会发生什么?
例如,我设法提交两个具有相同sha1校验和的文件,git会注意到它还是损坏了其中一个文件?
可以改进git以适应它,或者我是否必须更改为新的哈希算法?
(请不要通过讨论这个问题来转移这个问题 - 谢谢)
(我已经接受了Roland的答案,因为它确实是从git 1.7.4.4开始的正确(也是最简单的)解决方案,但请考虑这个问题,关于git的早期版本低至1.7.0.4.)
这个问题有点散漫(主要是由于我后来尝试建立有关情况的更多信息所导致的编辑),但标题中的文字是最重要的一点.
那就是:我正在尝试建立确定所有 git命令将在其输出中显示完整(未缩写)哈希的确定方法.
由于我专注于向后兼容性,因此需要涵盖旧版本的git 1.7.理想情况下,这些解决方案适用于git 1.7.0.4(在仍然支持的Ubuntu 10.04 LTS中使用),但我很满意至少1.7.2.5(对于Debian 6/Squeeze LTS).任何需要1.7.9.5之后的版本(Ubuntu 12.04 LTS)绝对不是理想的,但我仍然喜欢听到它们.
请注意,我不希望失去缩写哈希的能力 - 这个问题背后的目的是确保与git交互的工具总能访问完整且明确的哈希.当我在命令行上手动使用git时,我将在大多数时候想要正常的缩写.
Roland Smith建议使用命令行参数覆盖
core.abbrev看起来很理想,但遗憾的是只有v1.7.4.4才能工作(core.abbrev
之前不存在).我怀疑这意味着我们确实需要确定最全面的一组特定于命令的参数(例如git blame -l)来产生等效的效果.
一些(大多数?)git命令默认输出缩写的哈希值.例如,两者git blame并git-annotate执行此操作,这一事实在冲突发生时绊倒了当前的Emacs支持(因为他们可以在git 1.7.11.1之前执行 - 请参阅下面的编辑1),因为模糊的哈希值在尝试采取行动时会导致错误在他们之上).
开始编辑1
我在Changelog中注意到以下内容,这表明在最新版本的git中不会出现提示此问题的原始问题.
Fixes since v1.7.11.1
---------------------
* "git blame" did not try to make sure that the abbreviated commit
object names in its output are unique.
Run Code Online (Sandbox Code Playgroud)
如果git应该保证任何git命令报告的所有对象名称的唯一性(至少在命令运行时),那么这将大大减轻我的顾虑; 但显然,支持早期版本的git的问题的解决方案仍然会引起人们的兴趣.
结束编辑1
这可以用git blame -l和修复 …
我最近在工作中检查了我的一个git存储库,它有超过10,000个分支和超过30000个标记.新鲜克隆后,回收的总大小为12Gigs.我相信没有理由拥有10000个分支机构.所以我相信它们会在磁盘中占用相当大的空间.所以,我的问题如下
我正在尝试散列单个std::string和std::vector<std::string>值。我正在关注cppreference和boost 中的示例。当代码在 Windows 和 Linux 上编译并运行时,我得到了不同的结果。
的头文件MyHasher.h如下。
class MyHasher {
private:
MyHasher() = delete;
public:
static std::size_t hash(std::vector<std::string> ids);
static std::size_t hash(std::string s);
static void hashCombine(std::size_t &seed, std::size_t value);
};
Run Code Online (Sandbox Code Playgroud)
CPP文件MyHasher.cpp如下。
std::size_t MyHasher::hash(std::vector<std::string> ids) {
std::size_t seed = 0;
for (auto id : ids) {
std::size_t h = std::hash<std::string>{}(id);
hashCombine(seed, h);
}
return seed;
}
std::size_t MyHasher::hash(std::string s) {
std::size_t seed = 0;
std::size_t h = std::hash<std::string>{}(s);
hashCombine(seed, …Run Code Online (Sandbox Code Playgroud) 唯一 git commit 哈希值的总可能数量为 - 16^40,16 个可能的十六进制数字和 SHA 值中的 40 个总数字。
这近似于~ 10^48(比这个更多,但只是一个近似值)。
我的问题是 - 由于提交的值是唯一的,它们现在怎么还没用完呢?
或者
这些值是否仅在存储库内唯一,即本地唯一,这将防止它们被耗尽?
正如你所看到的,我不确定它们是本地独有的还是全球独有的。
编辑 -
问题已经得到解答,但我会推荐这个问题Git hash重复 ,因为它与我的问题有些相似。感谢@torek 提到这个问题。
git ×5
hash ×3
sha ×2
boost ×1
branch ×1
c++ ×1
cryptography ×1
git-branch ×1
git-commit ×1
github ×1
hashcode ×1
sha1 ×1
tags ×1