Πώς να αλλάξετε τον συγγραφέα της δέσμευσης για μια συγκεκριμένη δέσμευση;

Θέλω να αλλάξω τον συγγραφέα μιας συγκεκριμένης δέσμευσης στο ιστορικό. Δεν είναι η τελευταία δέσμευση.

Γνωρίζω για αυτή την ερώτηση - Πώς μπορώ να αλλάξω τον συγγραφέα μιας δέσμευσης στο git;.

Αλλά σκέφτομαι κάτι, όπου προσδιορίζω το commit με hash ή short-hash.

Λύση

Διαδραστική επαναφορά από ένα σημείο νωρίτερα στο ιστορικό από τη δέσμευση που θέλετε να τροποποιήσετε (git rebase -i). Στη λίστα των commits που αναβαθμίζονται, αλλάξτε το κείμενο από pick σε edit δίπλα στο hash του commit που θέλετε να τροποποιήσετε. Στη συνέχεια, όταν το git σας ζητήσει να αλλάξετε το commit, χρησιμοποιήστε αυτό:

git commit --amend --author="Author Name "

Για παράδειγμα, αν το ιστορικό των δεσμεύσεών σας είναι A-B-C-C-D-E-F με το F ως HEAD, και θέλετε να αλλάξετε τον συγγραφέα των C και D, τότε θα...

  1. Καθορίστε την εντολή git rebase -i B (εδώ είναι ένα παράδειγμα του τι θα δείτε μετά την εκτέλεση της εντολής git rebase -i B)
  • αν πρέπει να επεξεργαστείτε το A, χρησιμοποιήστε την εντολή git rebase -i --root
  1. Αλλάξτε τις γραμμές και για τα δύο C και D από pick σε edit
  2. Μόλις ξεκινήσει η επανεκτίμηση, θα σταματήσει πρώτα στο C.
  3. Θα κάνατε git commit --amend --author="Όνομα συγγραφέα "
  4. Στη συνέχεια git rebase --continue
  5. Θα σταματούσε και πάλι στο σημείο "D".
  6. Στη συνέχεια, θα μπορούσατε να git commit --amend --author="Όνομα συγγραφέα " ξανά
  7. git rebase --continue
  8. Το rebase θα ολοκληρωθεί.
  9. Χρησιμοποιήστε το git push -f για να ενημερώσετε την προέλευσή σας με τις ενημερωμένες δεσμεύσεις.
Σχόλια (44)

Οι απαντήσεις στην ερώτηση στην οποία παραπέμψατε είναι καλές απαντήσεις και καλύπτουν την περίπτωσή σας (η άλλη ερώτηση είναι πιο γενική, καθώς αφορά την επανεγγραφή πολλαπλών δεσμεύσεων).

Ως δικαιολογία για να δοκιμάσω το 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  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  (or ) 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
Σχόλια (9)

Όταν κάνετε git rebase -i υπάρχει αυτό το ενδιαφέρον κομμάτι στο έγγραφο:

Αν θέλετε να διπλώσετε δύο ή περισσότερες κοινοποιήσεις σε μία, αντικαταστήστε την εντολή "pick" για τη δεύτερη και τις επόμενες κοινοποιήσεις με "squash" ή "fixup". Αν οι δεσμεύσεις είχαν διαφορετικούς συγγραφείς, η διπλωμένη δέσμευση θα αποδοθεί στον συγγραφέα της πρώτης δέσμευσης. Το προτεινόμενο μήνυμα δέσμευσης για την αναδιπλωμένη δέσμευση είναι η συνένωση των μηνυμάτων δέσμευσης της πρώτης δέσμευσης και εκείνων με την εντολή "squash", αλλά παραλείπει τα μηνύματα δέσμευσης των δεσμεύσεων με την εντολή "fixup".

  • Αν έχετε ένα ιστορικό της μορφής A-B-C-D-E-F,
  • και θέλετε να αλλάξετε τα commits B και D (= 2 commits),

τότε μπορείτε να κάνετε:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • δημιουργήστε κενές δεσμεύσεις (μία για κάθε δέσμευση):
  • χρειάζεστε ένα μήνυμα για το σκοπό της επαναφοράς
  • git commit --allow-empty -m "empty"
  • Ξεκινήστε τη λειτουργία rebase
  • 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...

και μπορείτε απλά να αφαιρέσετε τις πρώτες γραμμές.

Σχόλια (0)