2010-09-12 7 views
80

Tôi muốn có thể thực hiện việc này cho một tập lệnh. Tôi về cơ bản tái tạo 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 điều khiển phiên bản khác. Tôi cần kịch bản để có thể thêm vào các commit trong Git trong khi vẫn giữ nguyên tác giả ban đầu của commit (và ngày tháng).Bạn cam kết mã như một người dùng khác nhau như thế nào?

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 nào cho phép tôi thực hiện việc này không? Tôi giả sử có, bởi vì git-p4 làm một cái 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? – alternative

+0

Tôi đồng ý, [nhập nhanh] (http://www.kernel.org/pub/software/scm/git/docs/git-fast-import.html) có thể là cách tốt nhất để đi. Bạn có thể sử dụng * git commit * (hoặc đúng hơn là hệ thống ống nước 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. –

+0

Tôi đã nghĩ về việc nhập nhanh, nhưng vì tôi khá là người mới bắt đầu, 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 công việc nhập khẩu nhanh như thế nào và vì thế tôi hơi do dự khi sử dụng nó cho đến khi tôi hiểu nó tốt hơn. Có, nó sẽ chậm hơn rất nhiều bằng cách sử dụng cam kết, nhưng ít nhất tôi sẽ biết những gì mong đợi - đặc biệt là trong khi gỡ lỗi. – Carl

Trả lời

113

Kiểm tra các tùy chọn --author cho git commit:

Từ man page:

--author=<author>

Override cam kết tác giả. Chỉ định tác giả rõ ràng sử dụng định dạng A U Thor <[email protected]> tiêu chuẩn. Nếu không, <author> được giả định là mẫu và được sử dụng để tìm kiếm hiện tại cam kết của tác giả đó (ví dụ: rev-list --all -i --author=<author>); tác giả cam kết sau đó được sao chép từ số đầu tiên như vậy được tìm thấy.

+12

Ngoài ra, tùy chọn '--date' để ghi đè ngày tháng. –

+0

Bạn có thể đưa ra một ví dụ cụ thể, mọi thứ tôi thử – studgeek

+0

@Tim Henigan: Có vẻ như tài liệu hiện được lưu trữ trên [Github] (http://schacon.github.com/git/git-commit.html) để người đàn ông * trang * liên kết bạn đã đăng đã chết. Bạn có thể xác nhận trang mới là điều tương tự (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) không? – R0MANARMY

58

Chỉ cần để thêm vào này: Tùy chọn --author đề cập trong câu trả lời được chấp nhận sẽ chỉ ghi đè 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ì một lý do bạn cần phải tự ghi đè lên các thông tin committer là tốt, sử dụng các biến GIT_COMMITTER_NAMEGIT_COMMITTER_EMAIL môi trường (có một GIT_COMMITTER_DATE cũng). Xem Git-Internals-Environment-Variables

$ GIT_COMMITTER_NAME="New Name" GIT_COMMITTER_EMAIL="[email protected]" git commit --author="New Name <[email protected]>" 

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

+8

... và để thấy sự khác biệt: 'git log --pretty = fuller' – bluenote10

+0

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 git internals man. – ksp