Làm thế nào để bạn cam kết mã với tư cách là một người dùng khác?


112

Tôi muốn có thể làm điều này cho một kịch bản. Về cơ bản, tôi đang tạo lại toàn bộ lịch sử phiên bản của một số mã trong Git - nó hiện đang sử dụng một hệ thống kiểm soát phiên bản khác. Tôi cần tập lệnh để có thể thêm cam kết vào Git trong khi vẫn giữ nguyên tác giả (và ngày tháng) ban đầu của cam kết.

Giả sử tôi biết tác giả cam kết và ngày / giờ thay đổi được thực hiện, có lệnh Git cho phép tôi thực hiện điều này không? Tôi giả định là có, bởi vì git-p4 làm điều gì đó tương tự. Tôi chỉ yêu cầu cách tốt nhất để làm điều đó.


1
Bạn đã thử sử dụng nhập nhanh chưa?
thay thế

Tôi đồng ý, nhập nhanh có thể là cách tốt nhất để thực hiện. Bạn có thể sử dụng git commit (hoặc đúng hơn là hệ thống ống dẫn bên dưới: hash-object , update-index , write-tree , commit-tree , update-ref , v.v.), nhưng nhập nhanh sẽ nhanh hơn.
Chris Johnsen

Tôi đã nghĩ đến nhập nhanh, nhưng bản thân tôi là người mới bắt đầu git, tôi quyết định sử dụng các lệnh cơ bản. Thành thật mà nói, tôi không hoàn toàn hiểu cách nhập nhanh hoạt động như thế nào và do đó, hơi do dự khi sử dụng nó cho đến khi tôi hiểu rõ hơn. Vâng, sẽ chậm hơn rất nhiều khi sử dụng commit, nhưng ít nhất tôi sẽ biết điều gì sẽ xảy ra - đặc biệt là trong khi gỡ lỗi.
Carl

1
git commit --author = "Name <name@example.com>" -a -m "commit msg"
Masih

Câu trả lời:


148

Kiểm tra --authortùy chọn cho git commit:

Từ trang người đàn ông :

--author=<author>

Ghi đè tác giả cam kết. Chỉ định một tác giả rõ ràng bằng cách sử dụng A U Thor <author@example.com>định dạng chuẩn . Mặt khác <author>được giả định là một mẫu và được sử dụng để tìm kiếm một cam kết hiện có của tác giả đó (tức là rev-list --all -i --author=<author>); tác giả cam kết sau đó được sao chép từ cam kết đầu tiên được tìm thấy.


18
Ngoài ra, --datetùy chọn ghi đè ngày tháng.
Chris Johnsen

Bạn có thể cho một ví dụ cụ thể, tất cả mọi thứ tôi cố gắng
studgeek

@Tim Henigan: Có vẻ như tài liệu hiện được lưu trữ trên Github nên liên kết trang người đàn ông mà bạn đăng đã chết. Bạn có thể xác nhận trang mới là cùng một thứ (trong trường hợp có các câu trả lời khác cần cập nhật liên kết)?
R0MANARMY

@ R0MANARMY: Tôi đã cập nhật URL. Các trang GitHub là chính xác. Tôi đã cập nhật liên kết của mình vì các trang nam không còn được lưu trữ trên kernel.org. Cảm ơn đã cho tôi biết về sự thay đổi.
Tim Henigan

1
Đây là những gì tôi đã kết thúc bằng cách sử dụng:git commit -a --author="$user_details" --date="submit_date $submit_time" --file=/tmp/commit_msg
Carl

113

Chỉ cần thêm như thế này: Các --authortùy chọn được đề cập trong câu trả lời được chấp nhận sẽ chỉ ghi đè lên các tác giả , không phải là committer thông tin của các cam kết.

Đó là hành vi đúng trong hầu hết các trường hợp, nhưng nếu vì lý do nào đó bạn cũng cần ghi đè thông tin người xác nhận theo cách thủ công , hãy sử dụng các biến GIT_COMMITTER_NAMEGIT_COMMITTER_EMAILmôi trường (cũng có GIT_COMMITTER_DATE). Xem Git-Internals-Môi trường-Biến

$ GIT_COMMITTER_NAME="New Name" GIT_COMMITTER_EMAIL="name@email.com" git commit --author="New Name <name@email.com>"

Điều này sẽ làm cho các cam kết xem xét như nó đã được tác giả cam kết bởi người sử dụng xác định.


16
... và để xem sự khác biệt:git log --pretty=fuller
bluenote10

2
Hoàn hảo. Đây là những gì tôi muốn và tôi không bao giờ có thể tìm thấy trang người đàn ông git internals.
ksp

3

Chỉnh sửa tệp ~ / .gitconfig của bạn và thêm bí danh mới để bạn có thể tùy chỉnh email và người dùng không phải mặc định.

[user]
  name = My Name
  email = default@email.com

[alias]
  commit-x = -c user.name='My X Name' -c user.email='mr_x@email.com' commit
  commit-y = -c user.name='My Y Name' -c user.email='mr_y@email.com' commit
  commit-z = -c user.name='My Z Name' -c user.email='mr_z@email.com' commit

Kiểm tra nó

git commit -m "Custom message with committer and author My Name <default@email.com>"
git commit-x -m "Custom message with committer and author My X Name <mr_x@email.com>"
git commit-y -m "Custom message with committer and author My Y Name <mr_y@email.com>"
git commit-z -m "Custom message with committer and author My Z Name <mr_z@email.com>"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.