在没有Git的情况下分配Git SHA1 - 换行符

时间:2014-12-18 16:30:56

标签: git sha1

git hash-object 命令以某种方式检测blob的内容是文本文件还是二进制文件。

还有一个git配置上下文问题(https://help.github.com/articles/dealing-with-line-endings/)。如果您将git配置为将某些类型的文件视为二进制内容,那么git将采取不同的行为。不知道上下文,您可能会生成错误的哈希码。对吗?

我认为最安全的方法是在项目的上下文中调用 git 哈希对象some_file 然后你可以100%确定它会给出正确的结果

我是对的还是我错过了什么?

下面是代码,它是一种再现情况的方法。

import org.apache.commons.codec.digest.DigestUtils
import org.apache.commons.lang3.ArrayUtils
class Test3 {
    public static void main(String[] args) {
        def bytesU = "this \n is a text".bytes
        def fileU = File.createTempFile("someFileU", ".tmp")
        fileU << bytesU;
        println DigestUtils.sha1Hex(ArrayUtils.addAll("blob ${bytesU.length}\0".bytes, bytesU))
        println "git hash-object ${fileU.absolutePath}".execute().text
        def bytesW = "this \r\n is a text".bytes
        def fileW = File.createTempFile("someFileW", ".tmp")
        fileW << bytesU;
        println DigestUtils.sha1Hex(ArrayUtils.addAll("blob ${bytesW.length}\0".bytes, bytesW))
        println "git hash-object ${fileW.absolutePath}".execute().text
        println DigestUtils.sha1Hex(ArrayUtils.addAll("blob 0\0".bytes, [] as byte[]))
        println DigestUtils.sha1Hex(ArrayUtils.addAll("blob 7\0foobar".bytes, [] as byte[]))
    }
}

以下是该程序的输出。第三行是git hash-obeject的结果,因为行结尾而不同。

  1. 792e2834867278884eeb8b5ff5f1954e1aa68660
  2. 792e2834867278884eeb8b5ff5f1954e1aa68660
  3. 7005d7429c4d219c73900f1a02e7980004614ac3
  4. 792e2834867278884eeb8b5ff5f1954e1aa68660
  5. e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
  6. 3a9f0b1970d7ed8d742dc3b9b36736eb03150766
  7. 这是一个较旧的帖子,对我来说是锁定的所以我决定创建单独的问题。请将其合并到How to assign a Git SHA1's to a file without Git?

1 个答案:

答案 0 :(得分:1)

  

我认为最安全的方法是在项目的上下文中调用git hash-object some_file,然后您可以100%确定它会给出正确的结果。

没错。除了换行符约定,您还可以提供自定义过滤器以规范化/本地化内容,例如替换并删除特定于repo的设置和诸如此类的东西,并git hash-object将这些设置删除并运行它们。