Θέλω να αλλάξω τον συγγραφέα μιας συγκεκριμένης δέσμευσης στο ιστορικό. Δεν είναι η τελευταία δέσμευση.
Γνωρίζω για αυτή την ερώτηση - Πώς μπορώ να αλλάξω τον συγγραφέα μιας δέσμευσης στο git;.
Αλλά σκέφτομαι κάτι, όπου προσδιορίζω το commit με hash ή short-hash.
Διαδραστική επαναφορά από ένα σημείο νωρίτερα στο ιστορικό από τη δέσμευση που θέλετε να τροποποιήσετε (git rebase -i <earliercommit>
). Στη λίστα των commits που αναβαθμίζονται, αλλάξτε το κείμενο από pick
σε edit
δίπλα στο hash του commit που θέλετε να τροποποιήσετε. Στη συνέχεια, όταν το git σας ζητήσει να αλλάξετε το commit, χρησιμοποιήστε αυτό:
git commit --amend --author="Author Name <[email protected]>"
Για παράδειγμα, αν το ιστορικό των δεσμεύσεών σας είναι A-B-C-C-D-E-F
με το F
ως HEAD
, και θέλετε να αλλάξετε τον συγγραφέα των C
και D
, τότε θα...
git rebase -i B
(εδώ είναι ένα παράδειγμα του τι θα δείτε μετά την εκτέλεση της εντολής git rebase -i B
)A
, χρησιμοποιήστε την εντολή git rebase -i --root
C
και D
από pick
σε edit
C
.git commit --amend --author="Όνομα συγγραφέα <[email protected]>"
git rebase --continue
git commit --amend --author="Όνομα συγγραφέα <[email protected]>"
ξανάgit rebase --continue
git push -f
για να ενημερώσετε την προέλευσή σας με τις ενημερωμένες δεσμεύσεις.Οι απαντήσεις στην ερώτηση στην οποία παραπέμψατε είναι καλές απαντήσεις και καλύπτουν την περίπτωσή σας (η άλλη ερώτηση είναι πιο γενική, καθώς αφορά την επανεγγραφή πολλαπλών δεσμεύσεων).
Ως δικαιολογία για να δοκιμάσω το git filter-branch
, έγραψα ένα σενάριο για να ξαναγράψω το Όνομα Συγγραφέα και/ή το Email Συγγραφέα για μια δεδομένη δέσμευση:
#!/bin/sh
#
# Change the author name and/or email of a single commit.
#
# change-author [-f] commit-to-change [branch-to-rewrite [new-name [new-email]]]
#
# If -f is supplied it is passed to "git filter-branch".
#
# If <branch-to-rewrite> is not provided or is empty HEAD will be used.
# Use "--all" or a space separated list (e.g. "master next") to rewrite
# multiple branches.
#
# If <new-name> (or <new-email>) is not provided or is empty, the normal
# user.name (user.email) Git configuration value will be used.
#
force=''
if test "x$1" = "x-f"; then
force='-f'
shift
fi
die() {
printf '%s\n' "$@"
exit 128
}
targ="$(git rev-parse --verify "$1" 2>/dev/null)" || die "$1 is not a commit"
br="${2:-HEAD}"
TARG_COMMIT="$targ"
TARG_NAME="${3-}"
TARG_EMAIL="${4-}"
export TARG_COMMIT TARG_NAME TARG_EMAIL
filt='
if test "$GIT_COMMIT" = "$TARG_COMMIT"; then
if test -n "$TARG_EMAIL"; then
GIT_AUTHOR_EMAIL="$TARG_EMAIL"
export GIT_AUTHOR_EMAIL
else
unset GIT_AUTHOR_EMAIL
fi
if test -n "$TARG_NAME"; then
GIT_AUTHOR_NAME="$TARG_NAME"
export GIT_AUTHOR_NAME
else
unset GIT_AUTHOR_NAME
fi
fi
'
git filter-branch $force --env-filter "$filt" -- $br
Όταν κάνετε git rebase -i
υπάρχει αυτό το ενδιαφέρον κομμάτι στο έγγραφο:
Αν θέλετε να διπλώσετε δύο ή περισσότερες κοινοποιήσεις σε μία, αντικαταστήστε την εντολή "pick"
για τη δεύτερη και τις επόμενες κοινοποιήσεις με "squash"
ή "fixup"
. Αν οι δεσμεύσεις είχαν διαφορετικούς συγγραφείς, η διπλωμένη δέσμευση θα αποδοθεί στον συγγραφέα της πρώτης δέσμευσης. Το προτεινόμενο μήνυμα δέσμευσης για την αναδιπλωμένη δέσμευση είναι η συνένωση των μηνυμάτων δέσμευσης της πρώτης δέσμευσης και εκείνων με την εντολή "squash"
, αλλά παραλείπει τα μηνύματα δέσμευσης των δεσμεύσεων με την εντολή "fixup"
.
A-B-C-D-E-F
,B
και D
(= 2 commits),τότε μπορείτε να κάνετε:
git config user.name "Correct new name"
git config user.email "[email protected]"
git commit --allow-empty -m "empty"
git rebase -i B^
B^
επιλέγει τον γονέα του B
.pick
σε squash
για αυτά.Παράδειγμα του τι θα σας δώσει το git rebase -i B^
:
pick sha-commit-B some message
pick sha-commit-C some message
pick sha-commit-D some message
pick sha-commit-E some message
pick sha-commit-F some message
# pick sha-commit-empty1 empty
# pick sha-commit-empty2 empty
# change commit B's author
pick sha-commit-empty1 empty
squash sha-commit-B some message
# leave commit C alone
pick sha-commit-C some message
# change commit D's author
pick sha-commit-empty2 empty
squash sha-commit-D some message
# leave commit E-F alone
pick sha-commit-E some message
pick sha-commit-F some message
Θα σας ζητηθεί να επεξεργαστείτε τα μηνύματα:
# This is a combination of 2 commits.
# The first commit's message is:
empty
# This is the 2nd commit message:
...some useful commit message there...
και μπορείτε απλά να αφαιρέσετε τις πρώτες γραμμές.