Pertanyaan Bagaimana mengubah nama penulis dan komuter dan e-mail dari beberapa commit di Git?


Saya sedang menulis skrip sederhana di komputer sekolah, dan melakukan perubahan pada Git (dalam repo yang ada di flashdisk saya, dikloning dari komputer saya di rumah). Setelah beberapa kali saya menyadari saya melakukan hal-hal sebagai pengguna root.

Apakah ada cara untuk mengubah penulis dari komitmen ini menjadi nama saya?


1998
2018-04-15 03:09


asal


Jawaban:


Mengubah penulis (atau komuter) akan membutuhkan penulisan ulang semua sejarah. Jika Anda baik-baik saja dengan itu dan berpikir itu layak maka Anda harus memeriksanya git filter-cabang. Halaman manual berisi beberapa contoh untuk Anda mulai. Juga perhatikan bahwa Anda dapat menggunakan variabel lingkungan untuk mengubah nama penulis, komitter, tanggal, dll. - lihat bagian "Variabel Lingkungan" dari halaman git man.

Secara khusus, Anda dapat memperbaiki semua nama dan email penulis yang salah untuk semua cabang dan tag dengan perintah ini (sumber: Bantuan GitHub):

#!/bin/sh

git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

800
2018-04-15 03:16



Menggunakan Interaktif Rebase

Anda bisa melakukannya

git rebase -i -p <some HEAD before all of your bad commits>

Kemudian tandai semua komitmen buruk Anda sebagai "edit" di file rebase. Jika Anda juga ingin mengubah commit pertama Anda, Anda harus menambahkannya secara manual sebagai baris pertama dalam file rebase (ikuti format dari baris lain). Kemudian, ketika git meminta Anda untuk mengubah setiap commit, lakukan

 git commit --amend --author "New Author Name <email@address.com>" 

edit atau tutup saja editor yang terbuka, lalu lakukan

git rebase --continue

untuk melanjutkan rebase.

Anda bisa lewati membuka editor sama sekali di sini dengan menambahkan --no-edit sehingga perintahnya adalah:

git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue

Komitmen Tunggal

Seperti yang telah dicatat oleh beberapa komentator, jika Anda hanya ingin mengubah commit terbaru, perintah rebase tidak diperlukan. Kerjakan saja

 git commit --amend --author "New Author Name <email@address.com>"

Ini akan mengubah penulis ke nama yang ditentukan, tetapi committer akan diatur ke pengguna Anda yang dikonfigurasi git config user.name dan git config user.email. Jika Anda ingin mengatur committer ke sesuatu yang Anda tentukan, ini akan mengatur baik penulis dan komitter:

 git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author

Catatan tentang Gabung Komit

Ada sedikit cacat dalam respons asli saya. Jika ada gabungan perintah antara arus HEAD dan Anda <some HEAD before all your bad commits>, kemudian git rebase akan meratakan mereka (dan omong-omong, jika Anda menggunakan permintaan tarik GitHub, akan ada banyak menggabungkan komitmen dalam sejarah Anda). Hal ini dapat sangat sering mengarah pada riwayat yang sangat berbeda (karena perubahan duplikat dapat "dipulihkan"), dan dalam kasus terburuk, dapat menyebabkan git rebase meminta Anda menyelesaikan konflik penggabungan yang sulit (yang kemungkinan sudah diselesaikan dalam commit gabungan). Solusinya adalah menggunakan -p bendera ke git rebase, yang akan mempertahankan struktur gabungan dari sejarah Anda. Halaman manual untuk git rebase memperingatkan bahwa menggunakan -p dan -i dapat menyebabkan masalah, tetapi di BUGS bagian itu mengatakan "Mengedit commit dan rewording pesan commit mereka harus berfungsi dengan baik."

aku sudah menambahkan -p ke perintah di atas. Untuk kasus di mana Anda baru saja mengubah komitmen terbaru, ini bukan masalah.


1415
2017-08-24 03:08



Anda juga bisa melakukan:

git filter-branch --commit-filter '
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

Catatan, jika Anda menggunakan perintah ini di command prompt Windows, maka Anda perlu menggunakan "dari pada ':

git filter-branch --commit-filter "
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi" HEAD

565
2018-05-15 19:15



Satu liner, tapi hati-hati jika Anda memiliki repositori multi-pengguna - ini akan berubah semua berkomitmen untuk memiliki penulis (dan penulis) yang sama (baru).

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='new@email'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='new@email';" HEAD

Dengan deretan baris dalam string (yang mungkin dalam bash):

git filter-branch -f --env-filter "
    GIT_AUTHOR_NAME='Newname'
    GIT_AUTHOR_EMAIL='new@email'
    GIT_COMMITTER_NAME='Newname'
    GIT_COMMITTER_EMAIL='new@email'
  " HEAD

481
2018-04-15 03:22



Itu terjadi ketika Anda tidak memiliki $ HOME / .gitconfig yang diinisialisasi. Anda dapat memperbaiki ini sebagai:

git config --global user.name "you name"
git config --global user.email you@domain.com
git commit --amend --reset-author

diuji dengan git versi 1.7.5.4


201
2018-02-16 09:46



Untuk satu kali commit:

git commit --amend --author="Author Name <email@address.com>"

(Diekstrak dari jawaban asmeurer)


179
2018-04-26 22:50



Dalam kasus di mana hanya beberapa komit teratas memiliki penulis yang buruk, Anda dapat melakukan ini semua di dalam git rebase -i menggunakan exec perintah dan --amend komit, sebagai berikut:

git rebase -i HEAD~6 # as required

yang menyajikan Anda dengan daftar komit yang dapat diedit:

pick abcd Someone else's commit
pick defg my bad commit 1
pick 1234 my bad commit 2

Kemudian tambahkan exec ... --author="..." baris setelah semua baris dengan penulis yang buruk:

pick abcd Someone else's commit
pick defg my bad commit 1
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD
pick 1234 my bad commit 2
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD

simpan dan keluar editor (untuk menjalankan).

Solusi ini mungkin lebih panjang untuk mengetik daripada yang lain, tetapi sangat terkontrol - saya tahu persis apa yang dikerjakannya.

Terima kasih kepada @asmeurer untuk ilhamnya.


150
2017-12-08 17:05



Github memiliki sebuah solusi yang bagus, yang merupakan skrip shell berikut:

#!/bin/sh

git filter-branch --env-filter '

an="$GIT_AUTHOR_NAME"
am="$GIT_AUTHOR_EMAIL"
cn="$GIT_COMMITTER_NAME"
cm="$GIT_COMMITTER_EMAIL"

if [ "$GIT_COMMITTER_EMAIL" = "your@email.to.match" ]
then
    cn="Your New Committer Name"
    cm="Your New Committer Email"
fi
if [ "$GIT_AUTHOR_EMAIL" = "your@email.to.match" ]
then
    an="Your New Author Name"
    am="Your New Author Email"
fi

export GIT_AUTHOR_NAME="$an"
export GIT_AUTHOR_EMAIL="$am"
export GIT_COMMITTER_NAME="$cn"
export GIT_COMMITTER_EMAIL="$cm"
'

107
2017-10-07 09:54



Seperti yang disebutkan oleh docgnome, menulis ulang sejarah itu berbahaya dan akan merusak repositori orang lain.

Tetapi jika Anda benar-benar ingin melakukan itu dan Anda berada dalam lingkungan bash (tidak ada masalah di Linux, di Windows, Anda dapat menggunakan git bash, yang disediakan dengan instalasi git), gunakan git filter-cabang:

git filter-branch --env-filter '
  if [ $GIT_AUTHOR_EMAIL = bad@email ];
    then GIT_AUTHOR_EMAIL=correct@email;
  fi;
export GIT_AUTHOR_EMAIL'

Untuk mempercepat, Anda dapat menentukan berbagai revisi yang ingin Anda tulis ulang:

git filter-branch --env-filter '
  if [ $GIT_AUTHOR_EMAIL = bad@email ];
    then GIT_AUTHOR_EMAIL=correct@email;
  fi;
export GIT_AUTHOR_EMAIL' HEAD~20..HEAD

78
2017-08-04 00:52