该文章属于<落萚>原创,转载请注明:
<落萚>http://www.jianshu.com/p/cc596ab2fe5b
*本文章已授权微信公众号 guolin_blog (郭霖)独家发布
前言
最近在Github点开your profile时发现,怎么明明有进行Commit and Push怎么在Contributions中不记录『绿油油』了?
查错
查看Commit信息也发现那些未被记录的Commit都是没有头像的,如下
打开Github官方帮助文档,看到Why are my contributions not showing up on my profile?这一部分,Github表示
为什么我的贡献不会显示在我的个人资料?
您的个人资料图表是您对GitHub资料库的贡献记录。贡献根据协调世界时(UTC)而不是本地时区的时间戳。只有符合某些标准才能计算贡献。在某些情况下,我们可能需要重新构建图形才能显示出贡献。
贡献的计算
Issue和Pull的请求
如果在独立的存储库中打开,而不是分支(fork),问题和Pull请求将显示在您的贡献图上。提交
如果满足以下所有条件,提交将显示在您的贡献图上:
>用于提交的电子邮件地址与您的GitHub帐户相关联。
>这些提交是在独立的存储库中进行的,而不是fork仓库。
>这些commits是在:
>在存储库的默认分支(通常是master
)
>在gh-pages
分支机构(对于具有Project Pages sites仓库)此外,至少满足下面条件中的一个:
>你是这个仓库的协作者,或者是这个版本库的拥有组织中的一员
>你fork过这个仓库
>你对这个仓库发起过Pull请求或者Issue
>你对这个仓库标记了Star
此处截了一部分,本人翻译水平有限,希望有能力的朋友们可以去看看官方英文原版文档《Why are my contributions not showing up on my profile?》
看到这里,本人打开了terminal,运行命令git config user.email
发现邮箱确实打错了,这并不是关联我Github账户的邮箱地址,于是导致了Contributions未记录我的提交记录
补救方案
难道没法补救了吗!因为一点小失误我们就就白提交了那么多?tan90°!
我们接着继续看Github官方帮助文档,最终找到了Changing author info,这篇文档告诉我们如何修改提交记录中的作者信息,但是有一个警告提示
要更改现有提交中记录的名称和/或电子邮件地址,您必须重写Git存储库的整个历史记录。
警告:此操作对您的仓库的历史具有破坏性。如果您正在与他人合作进行存储库,那么重写已发布的历史是一种不好的做法。仅限你在紧急情况下这样做。
我表示为确实很迫切想要那片『绿油油』…哈哈
那就…开干!
使用脚本更改仓库的Git历史记录
我们创建了一个脚本,它将更改之前在其作者或提交者字段中使用旧电子邮件地址的任何提交,以使用正确的名称和电子邮件地址。
注意:运行此脚本将重写所有仓库协作者的历史记录。完成这些步骤后,任何具有分支或克隆的人员必须取得重写的历史记录,并将任何本地更改重新修改为重写的历史记录。
打开Terminal
创建一个新的裸的克隆您的存储库:
git clone --bare https://github.com/(github用户名)/(仓库名).git
cd (仓库名).git
复制并粘贴脚本,根据您收集的信息替换以下变量:
>OLD_EMAIL
(旧的Email地址)
>CORRECT_NAME
(正确的用户名)
>CORRECT_EMAIL
(正确的Email地址)
当你愉快对着文档跟着步骤一步步做下去是,你以为发现了补救大法就可以补救了?tan90°!
说好的script呢!当我一脸懵逼时我的脑子里冒出了个大胆的想法……如果用科学上网法打开这个页面会不会就奇效?搞起搞起!
果然……见证奇迹的时候到了……
WTF???
好了不管如何至少找到了那个脚本…我们继续
- 新建一个文本文件,将下面的代码粘贴进去,然后把后缀名改为
.sh
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="旧的Email地址"
CORRECT_NAME="正确的用户名"
CORRECT_EMAIL="正确的Email地址"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
然后将sh文件复制到你刚刚Clone的目录下,在MacOS中是Clone到/Users/用户名
下
接着继续打开Terminal,输入bash
再将sh文件拖入Terminal,然后回车!结果Terminal提示你Permission denied
此时我们需要给此文件授权,在bash下输入chmod a+x repo.sh
现在再将文件拖入Terminal,点击Enter键,待它修改完输入exit
退出bash模式
用
git log
命令看看新 Git 历史有没有错误确认无误后
Push正确的历史到Github
git push --force --tags origin 'refs/heads/*'
- 最后清除掉这个临时仓库
cd ..
rm -rf (仓库名).git
此时你到Github看看your profile,那片『绿油油』就回来啦!再查看Commit信息你也会发现之前没有头像的提交记录都有头像啦!到这补救方案就做完咯!我将终端日志贴到了附录处。
收尾工作
处理完Github部分的提交信息我们还需要将本地Git的全局信息修改好,以免之后的提交再出问题,打开Terminal,输入
git config --global user.email "关联Github的邮件地址"
git config --global user.name "Github用户名"
若你使用Xcode,那你可以直接在Xcode中修改Git的全局信息,点击菜单栏的Xcode进入到Preferences
将Author Email修改为正确的Email地址即可
Warning!!!
不知道大家是否记得官方文档中有一段注意,在此我再将它贴出来
注意:运行此脚本将重写所有仓库协作者的历史记录。完成这些步骤后,任何具有分支或克隆的人员必须取得重写的历史记录,并将任何本地更改重新修改为重写的历史记录。
完成补救方案后你只修改了Github的记录,而未修改本地记录,此时就会出现不一致的情况
在Xcode中如果你直接Commit and Push就会弹出如下警告
Xcode告诉你本地版本已过时
正确的操作方法是先将Github上的仓库Pull下来
点击Pull后若提示Local repository up to date则本地仓库更新成功
而在Android Studio中,若直接Commit and Push将会提示
此时最好的做法依然是点击Cancel,然后将Github上的仓库Pull下来再进行Commit and Push
然而此时如果你本地的仓库又进行过比较多的修改了,你点击Pull后会弹出
此时点击Merge,然后会弹框给你预览合并后的效果,再点击Apply即可
然后再进行Commit and Push即可