相关疑难解决方法(0)

git中的哈希冲突

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

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

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

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

git hash sha1 hash-collision

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

为什么Git不使用更现代的SHA?

我读到Git使用SHA-1摘要作为修订版的ID.为什么不使用更现代的SHA版本?

git cryptography sha

77
推荐指数
3
解决办法
2万
查看次数

为所有命令制作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 blamegit-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

14
推荐指数
1
解决办法
817
查看次数

git分支和标签如何存储在磁盘中?

我最近在工作中检查了我的一个git存储库,它有超过10,000个分支和超过30000个标记.新鲜克隆后,回收的总大小为12Gigs.我相信没有理由拥有10000个分支机构.所以我相信它们会在磁盘中占用相当大的空间.所以,我的问题如下

  1. 分支和标签如何存储在磁盘中,例如使用什么数据结构,为每个分支存储什么信息?
  2. 如何获取有关分支的元数据?就像创建分支时一样,分支的大小是多少.

tags git branch git-branch

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

散列字符串值会导致 Linux 和 Windows 上的 C++ 输出不同

我正在尝试散列单个std::stringstd::vector<std::string>值。我正在关注cppreferenceboost 中的示例。当代码在 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)

c++ hash boost hashcode

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

git 中的哈希值如何不被耗尽?

唯一 git commit 哈希值的总可能数量为 - 16^40,16 个可能的十六进制数字和 SHA 值中的 40 个总数字。

这近似于~ 10^48(比这个更多,但只是一个近似值)。

我的问题是 - 由于提交的值是唯一的,它们现在怎么还没用完呢?

或者

这些值是否仅在存储库内唯一,即本地唯一,这将防止它们被耗尽?

正如你所看到的,我不确定它们是本地独有的还是全球独有的。

编辑 -

问题已经得到解答,但我会推荐这个问题Git hash重复 ,因为它与我的问题有些相似。感谢@torek 提到这个问题。

git hash github sha git-commit

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

标签 统计

git ×5

hash ×3

sha ×2

boost ×1

branch ×1

c++ ×1

cryptography ×1

git-branch ×1

git-commit ×1

github ×1

hash-collision ×1

hashcode ×1

sha1 ×1

tags ×1