2009-11-08 6 views
12

Tôi đang tìm cách nhập mã phần thứ ba vào kho lưu trữ git. Mã của bên thứ ba là "stm32f10x_stdperiph_lib" do ST cung cấp.Làm cách nào để nhập lib của bên thứ ba vào git?

Thư viện thực sự là một tập hợp các tệp c bình thường (và tệp tiêu đề) mà bạn chỉ bao gồm và xây dựng khi bạn thực hiện dự án STM32.

Vấn đề là họ chỉ cung cấp dưới dạng tệp zip và họ phát hành phiên bản mới, vì vậy tôi muốn thêm nhiều quyền kiểm soát hơn.

Vì vậy, kế hoạch của tôi là viết một kịch bản nhỏ mà thực hiện điều này:

  1. giải nén
  2. lấy một số file (Tôi không cần tất cả các file trong zip)
  3. nhập các tệp được chọn vào một kho lưu trữ git

Các vấn đề của tôi bắt đầu ở bước cuối cùng, làm cách nào để nhập và ghi đè tệp cũ bằng các tệp mới (và xóa các tệp không còn được bao gồm)?

Trả lời

24

Điều bạn đang tìm kiếm là "chi nhánh nhà cung cấp". Giả sử bạn muốn làm việc trên mã này và hợp nhất các bản cập nhật của nhà cung cấp với các bản vá lỗi của riêng bạn, dưới đây là cách bạn thực hiện điều đó dễ dàng.

git checkout -b vendor # create a vendor branch and check it out 

Đó là một điều một lần. Chi nhánh nhà cung cấp và CHỈ của nó sẽ chứa các bản cập nhật từ nhà cung cấp bên thứ ba. Bạn không bao giờ làm việc trong nhánh nhà cung cấp, nó chứa một lịch sử rõ ràng về mã của nhà cung cấp. Không có gì kỳ diệu về cái tên "nhà cung cấp" chỉ là thuật ngữ của tôi nắm giữ từ CVS.

Bây giờ, chúng tôi sẽ đưa phiên bản mới nhất từ ​​nhà cung cấp vào đó.

find . -not -path *.git* -and -not -path . -delete # delete everything but git files 
dump the 3rd party code into the project directory # I'll leave that to you 
git add .        # add all the files, changes and deletions 
git commit -a -m 'Vendor update version X.YY' # commit it 
git tag 'Vendor X.YY'     # optional, might come in handy later 

Chúng tôi xóa mọi thứ trước để git có thể thấy mọi thứ mà nhà cung cấp đã xóa. Khả năng của git để xem xóa và đoán các tập tin di chuyển làm cho thủ tục này đơn giản hơn nhiều so với Subversion.

Bây giờ bạn chuyển về phát triển của mình (tôi giả sử chính) và hợp nhất các thay đổi của nhà cung cấp.

git checkout master 
git merge vendor 

Đối phó với mọi xung đột như bình thường. Phiên bản vá của bạn hiện đã được cập nhật với nhà cung cấp. Làm việc trên chủ như bình thường.

Lần sau có phiên bản mới từ nhà cung cấp, lặp lại quy trình. Điều này lợi dụng việc hợp nhất tuyệt vời của git để cập nhật các bản vá của bạn với các thay đổi của nhà cung cấp.

1

Một chút ủng hộ của ma quỷ ở đây nhưng bạn có thực sự cần nó như một kho lưu trữ git không?

Có thể thiết lập tập lệnh tải xuống và cập nhật tất cả mã của bên thứ ba trong các dự án của bạn thay thế? Suy nghĩ của tôi là cuối cùng bạn sẽ chạy vào các phụ thuộc của bên thứ ba khó nhập. Ví dụ, với python tôi sử dụng buildout để cài đặt tất cả các phụ thuộc của tôi. Bằng cách đó tôi có thể dễ dàng kết hợp git, lanh lợi, lật đổ, các file zip, bao bì, vv

Tuy nhiên, giống như sau nên làm việc:

$ cd repo 
$ find . -not -path *.git* -and -not -path . -delete 
$ unzip /tmp/thirdparty.zip 
$ git add . 
$ git commit -a 'Updated version' 

Đó là, xóa tất cả các file trừ các .git thư mục và .gitignore, v.v. Điều này để xử lý trường hợp các tệp đã xóa trong dự án của bên thứ ba. Sau đó giải nén tập tin zip cập nhật vào thư mục. Thêm bất kỳ tệp mới nào vào kho lưu trữ. Cam kết.

Hy vọng điều đó sẽ hữu ích! :)

+0

Vì chúng có cùng tên trên tệp zip (ngay cả khi chúng thay đổi nội dung), tôi cảm thấy rất nguy hiểm khi chỉ tải xuống giải nén và hy vọng là tốt nhất. – Johan

+1

Tôi hiểu. Tuy nhiên, bạn không phải tải xuống từ internet. Bạn có thể tìm nạp nó từ một máy chủ nội bộ chỉ chứa các phiên bản được kiểm tra và phê duyệt. – lemonad

+1

Tại sao không sử dụng 'git clean' thay vì sử dụng' find' để xóa phiên bản cũ? –

0

Tuỳ chọn của tôi là tạo kho lưu trữ git, cập nhật định kỳ (git commit -a -m 'Update') và chỉ cần liên kết nó trong các dự án của tôi (như thư mục (ln -s, giao lộ, v.v) hoặc như một thư viện được chia sẻ). Đối với các tệp bạn không cần, hãy sử dụng .gitignore.

+0

Điều đó nghe có vẻ giống như kế hoạch của anh ấy, nhưng anh ấy yêu cầu trợ giúp về cách thay thế các tệp cũ bằng tệp mới, thêm và xóa khi cần. Cũng lưu ý rằng một số dự án đi kèm với một .gitignore. – ysth