虚無ありき

うるせーーーしらねーーー

Git Rebase -i を一気にやる

tl;dr;

  • リポジトリ自体が 1GB を超えてきて、clone に時間がかかるようになってきた
  • まとめたいが、Contributor はなるべくそのままにしたい
  • git rebase -ipick -> squash 作業がとてもきつい
    • なるべく、Contributor 単位でまとめたい

実作業

コミットログを Contributor 付きで Dump する

$ git log --pretty=format:"%h %an : %s" > ~/tmp/commit.log
$ head ~/tmp/commit.log
7b7c295 Hirotaka Suetake : Merge pull request #36 from pitagora-network/feature/license
52b4763 suecharo : Update Apache2.0 license using raw text
2c11e0d suecharo : Add LICENSE
6341c48 Tazro Inutano Ohta : Merge pull request #35 from pitagora-network/animal-genome-assembly-test
4d3c63d Tazro Inutano Ohta : Merge pull request #31 from tom-tan/feature/fix-disease-genome
a25f049 Tazro Inutano Ohta : animal genome assembly test passing
5f04608 Tazro Inutano Ohta : Merge pull request #34 from pitagora-network/fix-readme
1ec5627 Tazro Inutano Ohta : fix typo and wrong github accounts, add CWL intro and troubleshooting
6ed7c50 Tazro Inutano Ohta : Merge pull request #33 from pitagora-network/update-readme
719434f Tazro Inutano Ohta : update test status

最初の commit id を取る

$ tail -n 1 ~/tmp/commit.log
5400760 suecharo : Initial commit

`git rebase -i <first_commit_id> で rebase shell を立ち上げる

rebase shell 立ち上げたまま、中身を rebase.log として保存する

$ head ~/tmp/rebase.log
pick c76d3ff Add CWLs for the tools used in disease-genome
pick 65558cd Rename tool/curl to tool/wget
pick d1ce99c Imelement tool/wget
pick bfcc2e2 Add test for wget
pick 52215c3 Rename output object of wget from `output` to `downloaded`
pick b47bf00 Implement tool/tar
pick 6ae2c50 Minor fix for tar
pick 530f806 Remove {tar,wget}.sh
pick 02ba06c Implement tool/cat
pick bf115d2 Implement tool/gunzip

自作の Python スクリプトで pick の部分を squash に書き換える

# coding: utf-8
from pathlib import Path


def main():
    rebase_log = Path("~/tmp/rebase.log")
    commit_log = Path("~/tmp/commit.log")
    with rebase_log.open(mode="r") as f_r, commit_log.open(mode="r") as f_c:
        rebase = []     # [command, commit_id, commit_message]
        for row in f_r.read().splitlines():
            if row == "" or row.startswith("#"):
                continue
            ele = row.split(" ")
            l_row = [ele[0], ele[1], " ".join(ele[2:])]
            rebase.append(l_row)

        commit = dict()     # commit_id: commiter_name
        for row in f_c.read().splitlines():
            if row == "":
                continue
            ele = row.split(":")[0].strip().split(" ")
            commit[ele[0]] = " ".join(ele[1:])

    now_commiter = None
    for i in range(len(rebase)):
        commit_id = rebase[i][1]
        commiter = commit.get(commit_id, None)
        if now_commiter is None:
            rebase[i][0] = "pick"
        else:
            if commiter is None:
                rebase[i][0] = "pick"
            else:
                if now_commiter == commiter:
                    rebase[i][0] = "squash"
                else:
                    rebase[i][0] = "pick"
        now_commiter = commiter

    new_rebase_log = Path("~/tmp/new_rebase.log")
    with new_rebase_log.open(mode="w") as f:
        f.write("\n".join([" ".join(row) for row in rebase]))


if __name__ == "__main__":
    main()
$ python3 rebase.py
$ head ~/tmp/new_rebase.log
pick c76d3ff Add CWLs for the tools used in disease-genome
squash 65558cd Rename tool/curl to tool/wget
squash d1ce99c Imelement tool/wget
squash bfcc2e2 Add test for wget
squash 52215c3 Rename output object of wget from `output` to `downloaded`
squash b47bf00 Implement tool/tar
squash 6ae2c50 Minor fix for tar
squash 530f806 Remove {tar,wget}.sh
squash 02ba06c Implement tool/cat
squash bf115d2 Implement tool/gunzip

出力された ~/tmpnew_rebase.log を立ち上げたままの、rebase shell に貼る

rebase していく