代码之家  ›  专栏  ›  技术社区  ›  wizzwizz4

为什么Git GUI一直叫我Jon Skeet?

  •  1
  • wizzwizz4  · 技术社区  · 6 年前

    开玩笑的是,我把我笔记本电脑的用户帐户命名为Jon Skeet。我已将每个存储库选项配置为呼叫我 wizzwizz4 ,但当我查看我的提交时,我看到:

    Author: Jon Skeet <jon@myLaptop>  2018-12-21 22:07:11
    Committer: wizzwizz4 <wizzwizz4@users.noreply.github.com>  2018-12-21 22:12:07
    Parent: 39c31f5aebe43cdddbe00432207e4bb2cc6a777e (Initial commit)
    Branches: master
    Follows: 
    Precedes: 
    

    我的

    1 回复  |  直到 6 年前
        1
  •  5
  •   torek    6 年前

    任何现有提交中的数据都不能更改,甚至一个位也不能更改。 只要承诺 39c31f5aebe43cdddbe00432207e4bb2cc6a777e 存在于您的存储库中,它将继续具有相同的信息。(请注意,这是 你表现出的承诺。您没有显示提交本身的实际哈希ID,因此我无法使用该ID。)

    在Git GUI的非常特殊的情况下( git-gui.sh ,我从未使用过),从 source 好像有一个功能,使用“修正”可以读取 HEAD 提交的作者信息并复制它。一般来说 应该 不应该 不修改时请执行此操作。与命令行不同 git commit ,似乎没有Git GUI旋钮可以在不保留作者的情况下进行修改。如果它意外地将作者保留应用于 全新的

    更多信息,请继续阅读。

    背景

    每一次承诺都会有一些结果 元数据 与之相关的。原始提交对象中有两个相关的元数据行,称为 作者 提交者 . 从Git存储库中针对Git本身的各种提交中可以看出,这两个文件通常是相同的,但不一定是相同的。例如:

    $ git cat-file -p 5d826e972970a784bd7a7bdf587512510097b8c7
    tree c790c47fe551d5ed812cfefdac243eb972c1fde3
    parent b5796d9a3263b26a8ef32eeca76b3c1d62fcedc5
    author Junio C Hamano <gitster pobox.com> 1544328981 +0900
    committer Junio C Hamano <gitster pobox.com> 1544328981 +0900
    
    Git 2.20
    
    Signed-off-by: Junio C Hamano <gitster pobox.com>
    

    (我换了 @ 具有 尽可能减少垃圾邮件收集)。但是:

    $ git cat-file -p 6fcbad87d476d7281832af843dd448c94673fbfc
    tree aa05bc7af6e92f3db5d5d738adf0d0b1b3dd23b6
    parent b00bf1c9a8dd5009d5102aef7af9e2b886b1e5ad
    author Johannes Sixt <j6t kdbg.org> 1543858489 +0100
    committer Junio C Hamano <gitster pobox.com> 1543891852 +0900
    
    rebase docs: fix incorrect format of [... snip]
    

    请注意,这两个字段中的每个字段实际上有三个部分:全名、电子邮件地址<尖括号>,和带区域偏移的时间戳。

    当您使用 git提交 ,吉特 通常将author和committer设置为相同的三个字符串 而不是 作者

    作为参考,作者保存提交复制命令的 git提交 和两个人中的任何一个 --amend -c / -C 选择权; git cherry-pick git rebase . 这个 git am 该命令旨在将通过电子邮件发送的修补程序转换为提交:它需要的不是 犯罪 作为它的输入,所以我们可以说它保留了作者,但是我们必须定义我们所说的 作者 . 在这种情况下,, 吉特阿姆 通过解析邮箱格式的邮件来猜测作者信息。

    每个领域的机制

    只有一个底层Git命令, git commit-tree git提交树 可以从某处获取默认值。

    由于每个作者和提交人都有六个部分名称、电子邮件地址和时间戳,所以有六个地方可以获得具体的指令,而很多地方这次不是六个!获取默认值。首先,让我们列举一下小学六年级。

    而不是使用命令行选项, 环境变量 ,如中所述 the documentation :

    GIT_AUTHOR_NAME
    GIT_AUTHOR_EMAIL
    GIT_AUTHOR_DATE
    GIT_COMMITTER_NAME
    GIT_COMMITTER_EMAIL
    GIT_COMMITTER_DATE
    

    如果你设定 任何或全部 在这些变量中,设置将进入的值 所有后续的新提交 (直到您取消设置变量或您与此环境的会话过期为止,请取消设置变量)。

    如果(某些)环境变量未设置,则 信息取自配置项user.name和 user.email,或环境变量email(如果不存在),或 邮件(摘自 /etc/mailname 回到完全合格的状态

    这是一个善意的谎言,因为实际的代码路径取决于编译时选项,所以不同的Git安装可以有不同的自定义默认值。但总体思路是正确的:Git将使用 user.name user.email

    当然,默认时间戳只是您自己的计算机对当前时间的理解。相对较新的 user.useConfigOnly 设置告诉现代Git不要这样做 猜测 用户名 和/或 user.email git提交树 只会失败并显示一条错误消息,说它不知道你是谁。

    这个 git提交 前端命令也需要 --author --date GIT_AUTHOR_* 变量。

    当使用 前端带有 --修正 尽管它的名字,但实际上并不是 改变 而不是 当前的一个,所有这些意味着 --reset-author 标志告诉前端不要保留原始提交的作者信息。

    结论

    如果 新的 提交是指获得了错误的作者,而获得了正确的提交者,必须是以下两种情况之一:

    • 你正在使用 . 停止

    • GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL

    如果您有一些现有的提交,并且您正试图用一个新的和改进的提交来替换 git commit --amend . 当然,这只适用于命令行。如果你正在使用其他东西,看看它是否有类似的选项。

    现有的 那个 这显然取决于其他用户的固执程度,以及提交的位置。

    位于分支顶端且不在任何其他分支上的提交,使用 修改最后一次提交 . 历史上更远的提交更为困难:您可以使用交互式重基,或者 git replace ,或在特别丑陋的情况下, git filter-branch ,以替换它们(有时结合这些技术)。对旧提交的任何“更改”都必然会通过设计影响到其所有后代, 1. 因此,这种变化可能具有相当大的破坏性。然而,如果它正在“改变”其他人从未见过的历史,那么它就足够安全了。


    1. “坏”提交的直接子项包含坏提交的父哈希ID。因此,要让子项引用替换项,我们必须 他们的

    推荐文章