分割Push / Git操作小ネタ
概要
- git内でバイナリデータや大きなファイルを扱わざるを得ない場合に、コミットデータが大きくなることがある
- コミットデータが大きい場合には
git push
の通信エラーが発生する場合がある。通信中のコネクション切断や送信データ量が大きすぎることでエラーが発生してしまう(例.fatal: the remote end hung up unexpectedly
) - リポジトリをマイグレーションする際には通信エラーに向き合う必要があるため、地道に分割Pushをする際のやり方を記載する
sample
# origin の main ブランチにHEADから1つ前コミットをPushする
git push origin HEAD~:main
# origin の main ブランチに main から1つ前コミットをPushする
git push origin main~:main
# origin の main ブランチに 特定の Hash を Push する
git push origin XXXXXXXXXXXXXX:main
# origin の main ブランチに main から2つ前コミットをPushする
git push origin main~~:main
# または
git push origin main~2:main
# 100コミット前から1コミットまで順番にPushする
for i in $(seq 100 -1 1); do git push origin main~$i:main; done;
Pushオプションの説明
push時にはrefspecを指定することが可能。
これを使うとこんなコマンドも実行できる
# 手元の master ブランチをリモートの qa/master ブランチに Push する
git push origin master:refs/heads/qa/master
# origin の dev リモートブランチを削除
git push origin :dev
調査補足
fatal: The remote end hung up unexpectedly
のエラーを確認したところコンフィグのhttp.postBuffer
をいじるような記事が多くでてきた。一方でAWSのCodeCommitでは公式アナウンスがあった。
Git error: Error: RPC failed; result=56, HTTP code = 200 fatal: The remote end hung up unexpectedly
Problem: When pushing a large change, a large number of changes, or a large repository, long-running HTTPS connections are often terminated prematurely due to networking issues or firewall settings.
Possible fixes: Push with SSH instead, or when you are migrating a large repository, follow the steps in Migrate a repository in increments. Also, make sure you are not exceeding the size limits for individual files. For more information, see Quotas.
何度もhung upするような場合はSSH接続を試してみるか、素直に分割Pushしてみるほうが良いと思っています。
Discussion