🐥

分割Push / Git操作小ネタ

2023/08/22に公開

概要

  • 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オプションの説明

https://git-scm.com/docs/git-push

push時にはrefspecを指定することが可能。

https://git-scm.com/book/ja/v2/Gitの内側-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では公式アナウンスがあった。

https://docs.aws.amazon.com/codecommit/latest/userguide/troubleshooting-git.html

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