Skip to content

Instantly share code, notes, and snippets.

@Sacristan
Last active April 6, 2024 15:14
Show Gist options
  • Star 47 You must be signed in to star a gist
  • Fork 10 You must be signed in to fork a gist
  • Save Sacristan/8e759e6d7627a9ba4b26643869188426 to your computer and use it in GitHub Desktop.
Save Sacristan/8e759e6d7627a9ba4b26643869188426 to your computer and use it in GitHub Desktop.
Push commits by chunks
REMOTE=origin
BRANCH=$(git rev-parse --abbrev-ref HEAD)
BATCH_SIZE=10
# check if the branch exists on the remote
# if git show-ref --quiet --verify refs/remotes/$REMOTE/$BRANCH; then
# # if so, only push the commits that are not on the remote already
# range=$REMOTE/$BRANCH..HEAD
# else
# # else push all the commits
# range=HEAD
# fi
range=HEAD
echo "Range: $r"
# count the number of commits to push
n=$(git log --first-parent --format=format:x $range | wc -l)
echo "Commits to push: $n"
# push each batch
for i in $(seq $n -$BATCH_SIZE 1); do
# get the hash of the commit to push
h=$(git log --first-parent --reverse --format=format:%H --skip $i -n1)
echo "Pushing $h..."
git push $REMOTE $h:refs/heads/$BRANCH --force
done
# push the final partial batch
git push $REMOTE HEAD:refs/heads/$BRANCH
@miclgael
Copy link

miclgael commented Apr 6, 2021

🤩 This is so good - thanks, @Sacristan

Take a star ⭐

@2jiwon
Copy link

2jiwon commented Apr 13, 2021

man, you saved my day! Thank you for sharing this.

@Swooplezzz
Copy link

love it thx <3

@Sacristan
Copy link
Author

Thanks! :)

@yugr
Copy link

yugr commented Jan 28, 2022

I believe it should be

echo "Range: $range"

and set -eu won't hurt.

@geethasri-rev
Copy link

how to use this sh file can you please give working example?Thanks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment