From 233686d2a2fd5d9abc14fd3b352bfcfdb8466a8a Mon Sep 17 00:00:00 2001 From: Mattias Andersson <26146926+MattiasEh@users.noreply.github.com> Date: Mon, 7 Oct 2024 20:40:43 -0700 Subject: [PATCH] Change git-cp to use cleaner branch approach (#1169) * Change git-cp to use cleaner branch approach, per https://stackoverflow.com/a/46484848/32841 and https://devblogs.microsoft.com/oldnewthing/20190919-00/?p=102904 * Name the temporary branch to better fit in with git-extras * Again, git-extras naming is "copy", not "split" * Make the commit messages more clear --- bin/git-cp | 40 ++++++++++++++++------------------------ 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/bin/git-cp b/bin/git-cp index 091182482..cabb564b1 100755 --- a/bin/git-cp +++ b/bin/git-cp @@ -50,37 +50,29 @@ else fi fi - MERGE_OPT= - ff=$(git config --get merge.ff || true) - if [[ "$ff" == "only" ]]; then - MERGE_OPT="--ff" - fi echo "Copying $CURRENT_FILENAME into $DESTINATION_FILENAME" - INTERMEDIATE_FILENAME="${CURRENT_FILENAME//\//__}-move-to-${DESTINATION_FILENAME//\//__}" - - # We keep the existing file on the side in a commit - git mv "${CURRENT_FILENAME}" "${INTERMEDIATE_FILENAME}" - git commit -nm "Keep $CURRENT_FILENAME" + # Pre-check that the source and destination will work + git mv --dry-run "${CURRENT_FILENAME}" "${DESTINATION_FILENAME}" - # We come back to the previous state and revert that change - INTERMEDIATE_SAVED=$(git rev-parse HEAD) - git reset --hard HEAD^ + # Make a new branch and switch to it + BRANCH_NAME="git-cp-$(date +%s)" + git checkout -b "$BRANCH_NAME" - # We move the file to its new destination + # Move the original file to the new destination, in this branch git mv "${CURRENT_FILENAME}" "${DESTINATION_FILENAME}" - git commit -nm "Copy $CURRENT_FILENAME into $DESTINATION_FILENAME" + git commit -nm "--Duplicate $CURRENT_FILENAME history into $DESTINATION_FILENAME" - # We come back to the previous state and revert that change again - DESTINATION_SAVED=$(git rev-parse HEAD) - git reset --hard HEAD^ + # Restore the original file to keep it in the history + git checkout HEAD~ "${CURRENT_FILENAME}" + git commit -nm "--Restore $CURRENT_FILENAME" - # We keep both files - # shellcheck disable=SC2086 - git merge $MERGE_OPT "${DESTINATION_SAVED}" "${INTERMEDIATE_SAVED}" -m "Duplicate ${CURRENT_FILENAME} history." + # Switch to the original branch and merge this back in. + git checkout - + git merge --no-ff "$BRANCH_NAME" -m "Copy $CURRENT_FILENAME into $DESTINATION_FILENAME" - # We get back our original name - git mv "${INTERMEDIATE_FILENAME}" "${CURRENT_FILENAME}" - git commit -nm "Set back ${CURRENT_FILENAME} file" + # We're now done with the branch, so delete it. + # We shouldn't need -D here, as we've already merged it back in. + git branch -d "$BRANCH_NAME" fi