背景

获取了一个多人运动的git仓库,需要提取仓库里面所有的Email,然后根据Email搜一下Github是否存在对应的提交记录。这是一个很常见的问题,比如公司员工在提交gihtub的时候,没有注意修改提交的邮箱,很可能使用公司的邮箱进行提交。

解决方式

有两种方法可以提取一个仓库的所有邮箱:

第一种

git log "--format=format:%ae" | sort | uniq

第二种

git shortlog -sea | grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" | awk '{print tolower($0)}' | sort | uniq | grep -wv 'users.noreply.github.com'

然后根据github小技巧写一个批量获取邮箱的脚本:

# coding: utf-8
import requests
import json
from random import choice
import sys
import time

TOKEN_LISTS = [
      ""
]

def search_commits(token, email):
       headers = {"Accept": "application/vnd.github+json",
                   "Authorization": f"Bearer {token}"
                  }
       req = requests.get('http://api.github.com/search/commits',
           {'q': f"committer-email:{email}"},
           headers=headers)
       return json.loads(req.text)

if __name__ == "__main__":
    # file = sys.argv[1]
    file = "/tmp/email.txt"
    with open(file, "r") as f:
          for line in f.readlines():
                email = line.strip()
                token = choice(TOKEN_LISTS)
                
                try:
                    time.sleep(1)
                    if search_commits(token, email).get("total_count") > 0:
                        print(email)
                except Exception as e:
                     raise(e)

参考资料

⬆︎TOP