Skip to content

Commit

Permalink
Change git-cp to use cleaner branch approach (#1169)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
MattiasEh authored Oct 8, 2024
1 parent 5c3fb1b commit 233686d
Showing 1 changed file with 16 additions and 24 deletions.
40 changes: 16 additions & 24 deletions bin/git-cp
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 233686d

Please sign in to comment.