当我推送到 GitHub 时可以隐藏提交时间吗?

2024-02-18

正如标题所示:我希望推送到 GitHub 的所有提交都在 GitHub 的“提交”选项卡中显示推送时间戳,而不是提交时间戳。

我使用相当标准的工作流程:

<do some work>
git add -u
git commit -m "Message 1."
...
<do some work>
git add -u
git commit -m "Message N."
git push myrepo master

这使得所有 N 次提交都显示在 GitHub 中,这很好。但也显示了提交的时间,这是我不喜欢的。我更愿意只显示最后一个(或推送)的时间戳。


GitHub 将推送时间永久存储在其数据库中

例如,您推送的时间可以在 GitHub Events API 上永久查看。

例如,https://api.github.com/repos/cirosantilli/china-dictatorship/events https://api.github.com/repos/cirosantilli/china-dictatorship/events现在包含实际推送数据“2020-12-29T11:37:26Z”:

          "message": "66d9be0cb84c9650d6181b4b0fc2b70e2178bd9e",
          "distinct": true,
          "url": "https://api.github.com/repos/cirosantilli/china-dictatorship/commits/0817ad58873c5656d2828613a5a24ca8f286e910"
        }
      ]
    },
    "public": true,
    "created_at": "2020-12-29T11:37:26Z"
  },

虽然实际提交 https://github.com/cirosantilli/china-dictatorship/commit/66d9be0cb84c9650d6181b4b0fc2b70e2178bd9e是“2020 年 12 月 29 日星期二 00:00:00 +0000”。

这个API数据直接存储在他们的数据库中,而不是在Git提交数据中,并且没有办法伪造它。

如果你想隐藏这一点,据我所知,没有其他选择,你必须:

  • 在不同的时间推动,例如与 cron 作业
  • 删除存储库,然后推送数据就会从 API 中消失

这是一个隐私问题,尽管坚定的攻击者当然能够通过轮询某些感兴趣的用户的个人资料来获得类似的结果。相关门票:

  • https://github.com/isaacs/github/issues/142 https://github.com/isaacs/github/issues/142

提交数据时间

提交数据的提交时间可以通过环境变量控制:

GIT_COMMITTER_DATE=2000-01-01T00:00:00+0000 \
GIT_AUTHOR_DATE=2000-01-01T00:00:00+0000 \
git commit -m 'my message'

For --amend,那里使用--date作者日期选项:如何更改 Git 中旧提交的时间戳? https://stackoverflow.com/questions/454734/how-can-one-change-the-timestamp-of-an-old-commit-in-git/9701130#9701130

提交消息对象上没有进一步的时间指示 https://stackoverflow.com/questions/22968856/what-is-the-file-format-of-a-git-commit-object/37438460#37438460,这样对于隐私来说就足够了。

您可能希望自动执行此操作post-commit钩子解释如下:可以在 git hook 内自定义 GIT_COMMITTER_DATE 吗? https://stackoverflow.com/questions/32699631/can-git-committer-date-be-customized-inside-a-git-hook/53514970#53514970

这是一个更高级的钩子,使您的提交将在每天的午夜开始,并且每次新提交增加一秒 https://askubuntu.com/questions/408775/add-seconds-to-a-given-date-in-bash。这使得提交按时间排序,同时仍然隐藏提交时间。

.git/hooks/提交后

#!/usr/bin/env bash
set -eu
echo post-rewrite
if [ ! "${CIROSANTILLI_GITHOOKS_DISABLE:-0}" = 1 ]; then
  declare -a olds
  declare -A oldnew
  while IFS= read -r line; do
    echo "$line"
    old="$(echo "$line" | cut -d ' ' -f1)"
    new="$(echo "$line" | cut -d ' ' -f2)"
    oldnew[$old]="$new"
    olds+=("$old")
    news+=("$new")
  done
  # Save unstaged changes. Otherwise e.g. git commit --amend destroys them!
  # https://stackoverflow.com/questions/24520791/check-if-git-stash-stashed-anything/38785582#38785582
  nstash="$(git stash list | wc -l)"
  git stash
  git reset --hard "${news[0]}~"
  for old in "${olds[@]}"; do
    new="${oldnew[$old]}"
    git cherry-pick "$new" &>/dev/null
    olddate="$(git log --format='%cd' -n 1 "$old")"
    CIROSANTILLI_GITHOOKS_DISABLE=1 \
      GIT_COMMITTER_DATE="$olddate" \
      git commit \
      --amend \
      --no-edit \
      --no-verify \
      &>/dev/null \
    ;
  done
  # Restore unstaged changes.
  if [ "$(git stash list | wc -l)" -ne "$nstash" ]; then
    git stash apply
  fi
  echo
fi

GitHub 上游 https://github.com/cirosantilli/dotfiles/blob/0406773ce990a48445edae8863daf98af988d6d5/home/.git_hooks/post-commit.

不要忘记:

chmod +x .git/hooks/post-commit

在 git 2.19、Ubuntu 18.04 上测试。

不要忘记还处理:

  • git rebase with a post-rewrite hook: git rebase 而不改变提交时间戳 https://stackoverflow.com/questions/2973996/git-rebase-without-changing-commit-timestamps/53516609#53516609
  • git am with --committer-date-is-author-date正如所解释的可以在 git hook 内自定义 GIT_COMMITTER_DATE 吗? https://stackoverflow.com/questions/32699631/can-git-committer-date-be-customized-inside-a-git-hook/53514970#53514970

否则提交者日期仍然会泄露。

批量历史修改

以下是一种将现有范围内所有提交的提交时间固定为午夜同时保持日期不变的方法:

git-hide-time() (
  first_commit="$1"
  last_commit="${2:-HEAD}"
  git filter-branch --env-filter '
d="$(echo "$GIT_COMMITTER_DATE" | sed "s/T.*//")T00:00:00+0000)"
export GIT_COMMITTER_DATE="$d"
export GIT_AUTHOR_DATE="$d"
' --force "${first_commit}~..${last_commit}"
)

也可以看看:如何更改 Git 中旧提交的时间戳? https://stackoverflow.com/questions/454734/how-can-one-change-the-timestamp-of-an-old-commit-in-git

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我推送到 GitHub 时可以隐藏提交时间吗? 的相关文章

  • 使用 GIT 自动增加 AssemblyFileVersion

    好吧 我知道这可能不是传统的 但除此之外 我使用 AssemblyFileVersion 作为我的 构建名称 字符串 它的格式如下 File Version information for an assembly consists of t
  • 判断 Git 提交是否是合并/恢复提交

    我正在编写一个脚本 需要检查特定提交是否是合并 恢复提交 我想知道是否有 git 技巧 到目前为止我想到的 我绝对不想依赖这里的提交消息 是检查HASH 2看看我是否没有收到错误 是否有更好的方法 判断某个东西是否是合并很容易 这是不止一位
  • 如何预览 Git 中的隐藏内容?

    我想检查一个存储 并找出如果我将其应用于当前状态的工作树 它会发生什么变化 我知道我可以对存储进行 git diff 但这向我展示了工作树和存储之间的所有差异 而我只是想知道存储应用将改变什么 git stash show将向您显示最近存储
  • 克隆存储库而不将其设为原始远程存储库

    我正在从一台将被擦除的计算机上克隆一个 git 存储库 是否可以在不创建原始存储库的情况下克隆存储库origin master 或者我是否需要克隆它 然后删除远程分支 这是通过git remote rm origin Edit 存储库只有一
  • 如何重命名 GitHub 网站上的目录/文件夹?

    我在 GitHub 网站上找到了一种方法rename https github com blog 1436 moving and renaming files on github一个文件并成功完成 我也找到了一种方法rename https
  • Git 子模块:[电子邮件受保护]:权限被拒绝(公钥)。致命:无法从远程存储库读取

    我有一个问题git submodule update init remote 我收到错误 权限被拒绝和克隆失败 但我将 SSH 密钥添加到了我的 github 存储库中 我可以拉 推 git 克隆 我拥有所有需要的访问权限 我使用操作系统
  • Git:如何使外部存储库和嵌入式存储库作为通用/独立存储库工作?

    我有一个大项目 比方说A repo 其中有一个子文件夹来自B repo 当我提交时 我会遇到如下警告A repo warning adding embedded git repository extractor annotator serv
  • 交互式变基后,本地 Git 分支已偏离原始分支

    我有一个本地分行 CRM ayrshireminis 其中有一些我已推送到原点的提交 origin CRM ayrshireminis 这个分支是从创建的develop大约一周前的一个分支 其他合作者已经在该分支上完成了一周的工作 我想做的
  • git 预提交钩子格式代码 - Intellij/Android Studio

    本要点展示了如何在预提交时使用 Eclipse 格式化程序自动格式化 Java 代码 Source https gist github com ktoso 708972 https gist github com ktoso 708972
  • 防止 .exe 时间戳发生变化

    有谁知道如何防止可执行文件的时间戳更改 我正在尝试为 exe 生成一致的哈希代码 但我认为时间戳可能会阻止这种情况发生 每次我重新编译代码 VS C 时 FastSum 都会生成不同的校验和 Thanks PE 文件格式 如 EXE 中 具
  • CakePHP - 获取上次运行的查询

    我想获取 CakePHP 运行的最后一个查询 我无法在 core php 中打开调试 也无法在本地运行代码 我需要一种方法来获取最后一个 sql 查询并将其记录到错误日志中而不影响实时站点 该查询失败但正在运行 像这样的事情会很棒 this
  • git diff 在尖括号中显示 unicode 符号

    我有一个带有 unicode 符号 俄语文本 的文件 当我修复一些拼写错误时 我使用git diff color words 看看我所做的改变 如果是 unicode 西里尔文 符号 尖括号会造成一些混乱 如下所示 cat p1 cat p
  • 重新打包存储库对于大型二进制文件有用吗?

    我正在尝试将大量历史记录从 Perforce 转换为 Git 并且一个文件夹 现在是 git 分支 包含大量大型二进制文件 我的问题是运行时内存不足git gc aggressive 我的主要问题是重新打包存储库是否可能对大型二进制文件产生
  • 推送时发生 Git 错误 - update_ref 失败

    当我尝试推送本地提交时遇到问题 这可能是在 Android Studio 崩溃时发生的 这是错误 update ref 引用 refs remotes origin master 失败 无法锁定 ref refs remotes origi
  • 分支明显不同,但提交历史是相同的

    git status告诉我我的分支和我在另一个存储库上开始的分支已经分歧 On branch master Your branch and origin master have diverged and have 13 and 13 dif
  • 如何解决 VSTS 中拉取请求中的合并冲突?

    我已经创建了拉取请求 我进入了这个 批准 按钮不执行任何操作 并且 完成 被禁用 如何解决拉取请求中的冲突 Update 微软刚刚添加了基于浏览器的合并 这可能会让你摆脱小冲突的困境 并提供自 Sprint 150 起改进了不同场景的可视化
  • 部署在github中的Jekyll显示index.html文件的原始文本

    我正在尝试使用来自的分叉存储库来部署 Jekyll 网站https github com cotes2020 jekyll theme chirpy https github com cotes2020 jekyll theme chirp
  • git diff - 只显示哪些目录发生了变化

    有没有办法只列出已更改的目录 如果我在 git root 的话 project 我更改的文件是 project subtool file1 project subtool file2 project subtool3 file1 我只是想
  • readthedocs 中自动生成的索引文件

    我无法上传到阅读文档 http docs readthedocs io en latest 我为我的项目准备的文档 我正在尝试了解问题所在 该文档在本地构建良好make html但我无法上传 GitHub 项目是ASCII基因组 https
  • 远程测试时如何搭建git开发环境

    这似乎是一个愚蠢的问题 但我觉得我对 GIT 相当了解 但我似乎无法按照我的意愿设置我的开发环境 我要么错过了一些非常简单的东西 要么我做错了 我在我的服务器上初始化了一个裸 git 存储库 将其克隆到我的本地计算机 提交我的文件并推送到原

随机推荐