Git Rebase -i を一気にやる
tl;dr;
- リポジトリ自体が 1GB を超えてきて、clone に時間がかかるようになってきた
- まとめたいが、Contributor はなるべくそのままにしたい
git rebase -i
のpick -> 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 していく