2013-05-13 31 views
50

Tôi có hai kho lưu trữ. Trong một, tôi thực hiện các thay đổi đối với tệp ./hello.test. Tôi cam kết thay đổi và tạo bản vá từ cam kết đó với git format-patch -1 HEAD. Bây giờ, tôi có một kho lưu trữ thứ hai chứa một tệp có cùng nội dung như hello.test nhưng được đặt trong một thư mục khác dưới một tên khác: ./blue/red/hi.test. Tôi làm cách nào để áp dụng bản vá nói trên cho tệp hi.test? Tôi đã thử git am --directory='blue/red' < patch_file nhưng điều đó tất nhiên phàn nàn rằng các tập tin không được đặt tên giống nhau (mà tôi nghĩ Git không quan tâm?). Tôi biết tôi có lẽ có thể chỉnh sửa khác biệt để áp dụng cho tập tin cụ thể nhưng tôi đang tìm một giải pháp lệnh.Cách áp dụng bản vá Git cho tệp có tên và đường dẫn khác?

+0

Liên quan đến: https://stackoverflow.com/q/3367254/1959808 –

Trả lời

51

Bạn có thể tạo bản vá bằng cách sử dụng git diff và sau đó áp dụng nó bằng tiện ích patch, cho phép bạn chỉ định tệp bạn muốn áp dụng khác biệt.

Ví dụ:

cd first-repo 
git diff HEAD^ -- hello.test > ~/patch_file 

cd ../second-repo 
patch -p1 blue/red/hi.test ~/patch_file 
+0

Ah, đẹp, không nghĩ về điều đó. Tuy nhiên, có cách nào để làm điều này với lệnh Git để dữ liệu cam kết (ngày & thời gian, cam kết tác giả, cam kết tin nhắn) được giữ nguyên không? – mart1n

+0

Có thể bạn có thể làm gì đó với 'am' hoặc' apply', nhưng tôi không thể tìm thấy nó. Nếu bạn thấy mình sao chép nhiều thay đổi, có thể có giải pháp tốt hơn khi sử dụng mô-đun con hoặc bất kỳ ngôn ngữ nào bạn chọn cung cấp để chia sẻ mã (ví dụ: trong Ruby bạn có thể trích xuất mã trùng lặp dưới dạng đá quý). – georgebrock

+0

Điều này thực sự liên quan đến tài liệu (tệp nguồn là XML). Submodules không thực sự là một lựa chọn vì tôi sẽ phải tạo ra một trường hợp mạnh mẽ cho họ trong cơ sở hạ tầng hiện có của chúng tôi. – mart1n

7

Trả lời câu hỏi của riêng tôi với một kịch bản mà chỉ này: https://github.com/mprpic/apply-patch-to-file

Thay vì sửa đổi các tập tin vá bằng tay, nó nhắc nhở người sử dụng cho các tập tin mục tiêu, đổi các vá, và áp dụng nó cho repo bạn đang ở.

24

Có một giải pháp đơn giản không liên quan đến chỉnh sửa bản vá thủ công cũng như tập lệnh bên ngoài.

Trong kho đầu tiên (điều này cũng có thể xuất khẩu một loạt các cam kết, sử dụng -1 nếu bạn muốn chọn chỉ có một cam kết):

git format-patch --relative <committish> --stdout > ~/patch 

Trong kho thứ hai:

git am --directory blue/red/ ~/patch 

Thay vào đó sử dụng --relative trong git format-patch, một giải pháp khác là sử dụng tùy chọn -p<n> trong git am để dải n thư mục từ đường dẫn của các bản vá lỗi, như được đề cập trong một answer to a similar question.

Bạn cũng có thể chạy git format-patch --relative <committish> mà không cần --stdout và nó sẽ tạo một tập hợp các tệp .patch. Sau đó, các tệp này có thể được cấp trực tiếp tới git am với git am --directory blue/red/ path/to/*.patch.

+4

Điều này vẫn dựa trên thực tế là các tên tập tin là như nhau, phải không? – mart1n

+0

đã lưu ngày của tôi :) – tuxinaut

+1

Cần lưu ý rằng tùy chọn '--directory' xuất hiện để yêu cầu bạn chỉ định đường dẫn đầy đủ của thư mục có liên quan đến thư mục gốc; một cái gì đó như '--directory =. /' trong khi chdir'd vào một thư mục con trong repo sẽ không hoạt động. – Reid