2010-05-27 26 views
69

Tôi đã cam kết một loạt cam kết cho một dự án trên Github, tuy nhiên tôi nhận ra rằng mình chưa thiết lập email và tên đầy đủ trên máy tính mà tôi hiện đang sử dụng thực hiện cam kết của tôi và do đó hình đại diện người dùng và địa chỉ email không có ở đó.Git, viết lại tên người dùng và email cam kết trước đây

Tôi làm cách nào để viết lại tất cả email và tên người dùng cam kết trước đây?

+6

bản sao có thể có của [Làm cách nào để thay đổi tác giả của cam kết trong git?] (Http://stackoverflow.com/questions/750172/how-do-i-change-the-author-of-a-commit -in-git) – givanse

Trả lời

108

Bạn có thể sử dụng bí danh này để bạn có thể làm:

git change-commits GIT_AUTHOR_NAME "old name" "new name" 

hoặc trong 10 cam kết cuối cùng:

git change-commits GIT_AUTHOR_EMAIL "[email protected]" "[email protected]" HEAD~10..HEAD 

Bí danh:

change-commits = "!f() { VAR=$1; OLD=$2; NEW=$3; shift 3; git filter-branch --env-filter \"if [[ \\\"$`echo $VAR`\\\" = '$OLD' ]]; then export $VAR='$NEW'; fi\" [email protected]; }; f " 

Nguồn: https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig

Hy vọng nó hữu ích.

+1

Cảm ơn, nó hoạt động hoàn hảo! – josal

+1

tôi đã không nhận được thẻ của tôi, nhưng điều này hoạt động. cảm ơn. – Bharat

+5

Ngoài ra, 'git change-commits GIT_COMMITTER_EMAIL '[email protected]" "[email protected]" 'để thay đổi email của người gửi thư. –

50

Giải pháp là đã có: Change the author and committer name and e-mail of multiple commits in Git

Cụ thể,

git filter-branch -f --env-filter \ 
"GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \ 
GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD 
+2

điều này sẽ không thay đổi tên tác giả cho tất cả các cam kết (toàn bộ lịch sử) của chi nhánh? – hasen

+2

Vâng, điều đó sẽ thay đổi tất cả các cam kết đối với thông tin tác giả mới. – ewall

+2

Vui lòng đánh dấu câu hỏi là trùng lặp thay vì sao chép dán câu trả lời. – givanse

20

Nếu bạn đã đẩy một số cam kết của mình vào kho lưu trữ công cộng, bạn làm không muốn làm điều này, hoặc nó sẽ tạo ra một phiên bản thay thế lịch sử của chủ nhân mà những người khác có thể đã sử dụng. "Đừng băng qua suối ... Nó sẽ là xấu ..."

Điều đó nói rằng, nếu nó chỉ là cam kết bạn đã thực hiện cho kho lưu trữ địa phương của bạn, sau đó bằng mọi cách sửa lỗi này trước khi bạn đẩy lên máy chủ. Bạn có thể sử dụng lệnh git filter-branch với các tùy chọn --commit-filter, vì vậy nó chỉ chỉnh sửa các cam kết mà phù hợp với thông tin không chính xác của bạn, như thế này:

git filter-branch --commit-filter ' 
     if [ "$GIT_AUTHOR_EMAIL" = "[email protected]_host.local" ]; 
     then 
       GIT_AUTHOR_NAME="Your Name Here (In Lights)"; 
       GIT_AUTHOR_EMAIL="[email protected]_host.com"; 
       git commit-tree "[email protected]"; 
     else 
       git commit-tree "[email protected]"; 
     fi' HEAD 
7

Sau khi áp dụng Olivier Verdier của câu trả lời:

git filter-branch -f --env-filter \ 
"GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \ 
GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD 

... để đẩy lịch sử thay đổi về việc sử dụng ban đầu kho:

git push origin +yourbranch 

Lệnh trên (chú ý cộng) lực lượng viết lại lịch sử trên bản repo gốc. Sử dụng cẩn thận!

+0

Làm việc cho tôi, cũng viết lại chính xác lịch sử xuất xứ. – Xeverous

+0

Điều này sẽ viết lại tất cả các cam kết - bất kể ai là tác giả của nó. Sử dụng cẩn thận. –

Các vấn đề liên quan