ハイパーマッスルエンジニア

Vim、ShellScriptについてよく書く

1年を振り返るときに使ったgitコマンド

コミット履歴を保ったままブランチを統合する

ブランチ整理のために。過去のコミット履歴をなかったことにしたくなかった。

下記の記事が神。

qiita.com

# 新規リポジトリを作成
mkdir new_repository
cd new_repository
git init

# リポジトリを統合
git remote add ${repositoryName} ~/Desktop/${repositoryName}
git fetch ${repositoryName}
git read-tree --prefix=${repositoryName} ${repositoryName}/master
git checkout -- .
git add .
git merge -s subtree ${repositoryName}/master --allow-unrelated-histories

2020年に作ったリポジトリ一覧を出す

GithubのAPIを使って出した。APIのパラメータで日時を指定して取得することができなかったので、jqのselect文で2020-01-01~2020-12-31でフィルタして取得することに。
jqのパイプで@tsvとして出力する方法は知らなかった。

#!/usr/bin/env bash
TOKEN=XXXXXXXXXXXXXX
USERNAME=YYYYYYYYY

main() {
  # ページネーションの最後の番号を取得
  local last=$(curl -sI -H "Authorization: token ${TOKEN}" "https://api.github.com/user/repos?per_page=100&page=1" \
    | tr "," "\n" \
    | grep 'last' \
    | grep -oP "(?<=&page\=).*(?=\>)"
  )

  # tsvで出力する用のヘッダー
  echo "name     private     language    url     created_at  updated_at"

  # 一度に100件までしか取得できないので、ページネーション分回す
  for page in $(seq 1 $last); do
    curl -s -H "Authorization: token ${TOKEN}" "https://api.github.com/user/repos?per_page=100&page=${page}" \
      | jq '.[]
      | select(.owner.login == "'${USERNAME}'")
      | select("2020-01-01" <= .created_at and .created_at <= "2020-12-31")
      '
  done | jq -r --slurp 'sort_by(.created_at) | .[] | [.name, .private, .language, .html_url, .created_at, .updated_at] | @tsv'
}
main

上記をgit.shとして保存して実行する。

$ sh git.sh
name     private         language        url     created_at      updated_at
get-twitter-from-qiita  false   JavaScript      https://github.com/Rasukarusan/get-twitter-from-qiita   2020-01-07T12:31:26Z    2021-01-01T08:44:55Z
react-tutorial  true    JavaScript      https://github.com/Rasukarusan/react-tutorial   2020-01-09T00:04:29Z    2020-01-12T07:29:49Z
react-search-author     false   JavaScript      https://github.com/Rasukarusan/react-search-author      2020-01-13T00:42:50Z    2020-02-09T01:16:00Z

出力をNotionに貼り付けるといい感じの表が作成される。

f:id:rasukarusan:20210109230051p:plain
スプレッドシートに一度貼ってからコピペするといい感じにできる

スター数が多い順にリポジトリを出力する関数も書いた。

stars() {
  local last=$(curl -sI -H "Authorization: token ${TOKEN}" "https://api.github.com/user/repos?per_page=100&page=1" \
    | tr "," "\n" \
    | grep 'last' \
    | grep -oP "(?<=&page\=).*(?=\>)"
  )

  echo "name     stargazers_count    language    url     created_at  updated_at"

  for page in $(seq 1 $last); do
    curl -s -H "Authorization: token ${TOKEN}" "https://api.github.com/user/repos?per_page=100&page=${page}" \
      | jq '.[]
      | select(.owner.login == "'${USERNAME}'")
      | select(.stargazers_count > 0)
      '
  done | jq -r --slurp 'sort_by(.stargazers_count) | reverse | .[] | [.name, .stargazers_count, .language, .html_url, .created_at, .updated_at] | @tsv'
}

終わりに

改めて思うけどgitコマンド色んな機能ありすぎてすごい。