2010-07-28 27 views
5

Tôi có kho Git ban đầu được nhập từ Subversion. Các bộ phận của tác giả/thông tin của người gửi tiền sai, không phải là lỗi của Git mà chủ yếu là do sự cẩu thả cam kết với Subversion.Sử dụng bộ lọc git-branch để viết lại tác giả/ủy thác và cam kết tin nhắn đồng thời

Tôi muốn sử dụng git filter-branch để viết lại lịch sử của kho lưu trữ, sửa thông tin người gửi và tác giả.

Sự cố là ... Tôi cần phải trích xuất thông tin tác giả ra khỏi cam kết tin nhắn. Theo như tôi có thể biết, git filter-branch cho phép bạn lọc và thay đổi thông tin tác giả (với --env-filter) và/hoặc để lọc thông báo cam kết (với --msg-filter), nhưng không để thực hiện cả hai cùng một lúc, với thông tin được chia sẻ giữa các bộ lọc khác nhau .

Vì vậy, tôi là loại stumped về cách làm điều này ... tốt nhất tôi có thể nghĩ là làm điều đó trong nhiều lần: đầu tiên, thu thập tất cả các thông điệp cam kết, sau đó thực hiện một kịch bản để đi qua và lọc tất cả thông tin tác giả/người gửi. Điều này có vẻ khá không phù hợp và dễ xảy ra lỗi, vì vậy tôi tự hỏi liệu có ai khác đã tìm ra một loại công việc này suôn sẻ hơn không.

Trả lời

4

Điều duy nhất tôi có thể nghĩ là hoàn thành một lần là sử dụng bộ lọc cam kết. Giống như bộ lọc tin nhắn, nó có thông điệp tường trình trên stdin, vì vậy bạn sẽ có thể phân tích nó và tìm ra những gì bạn cần. Sau đó, bạn có thể tự đặt các biến thích hợp và tự gọi số git commit-tree. (Các cam lọc cơ bản là một thả thay thế cho cam-cây, lấy lý lẽ tương tự và sản xuất sản lượng tương tự.)

Trong bash, nó muốn được một cái gì đó như thế này:

message=$(read_from_stdin) 

modify_env_vars "$message" 

echo "$message" | git commit-tree "[email protected]" 

tôi đã không bao giờ cố gắng này, nhưng tôi không thể thấy lý do tại sao nó sẽ không hoạt động, giả sử bạn viết hai chức năng vỏ đúng cách!

(Và chỉ một lưu ý nhỏ - không quá nhiều mà --env-filter--msg-filter không thể ảnh hưởng lẫn nhau, đó là chúng luôn chạy theo thứ tự đó. Vì vậy, bộ lọc đầu tiên có thể để lại các tác dụng phụ trong tệp hoặc môi trường để người khác nhìn thấy, nhưng họ đang ở trong một trật tự mà giữ cho bạn không làm những gì bạn muốn.)

+0

Cảm ơn, Jefromi, tôi sẽ cho cú đánh này! Ngoài ra, điểm tốt về thứ tự của bộ lọc --env và --msg-filter: Tôi đã xem xét để lại các tệp tạm thời sau khi bạn đề xuất, nhưng nhận ra rằng nó sẽ không hoạt động theo thứ tự tôi muốn. –

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