Làm cách nào để làm việc với kho git trong kho khác?


283

Tôi có kho lưu trữ phương tiện Git nơi tôi lưu giữ tất cả các tệp và tập lệnh chính JavaScript và CSS mà tôi sẽ sử dụng cho các dự án khác nhau.

Nếu tôi tạo một dự án mới trong kho Git của riêng nó, làm cách nào để sử dụng các tệp JavaScript từ kho phương tiện của tôi trong dự án mới theo cách khiến tôi không phải cập nhật cả hai bản sao của tập lệnh khi tôi thay đổi ?


Xin vui lòng xem các cây con câu trả lời dưới đây từ @ Ruslan-kabalin. Lưu ý: trước khi cam kết (hoặc overcommit ) móc là một cách để đối phó với sự phản đối nêu ra bởi Robert Dundon
Hedgehog

Câu trả lời:


347

Chìa khóa là mô đun con git .

Bắt đầu đọc chương Submodules của Sách cộng đồng Git hoặc Hướng dẫn sử dụng

Giả sử bạn có kho lưu trữ PRO DỰ1, PRO DỰ2 và MEDIA ...

cd /path/to/PROJECT1
git submodule add ssh://path.to.repo/MEDIA
git commit -m "Added Media submodule"

Lặp lại trên repo khác ...

Bây giờ, điều thú vị là, bất cứ khi nào bạn cam kết thay đổi với MEDIA, bạn có thể làm điều này:

cd /path/to/PROJECT2/MEDIA
git pull
cd ..
git add MEDIA
git commit -m "Upgraded media to version XYZ"

Điều này chỉ ghi lại thực tế là mô hình con MEDIA ININ PRO DỰ2 hiện đang ở phiên bản XYZ.

Nó cung cấp cho bạn quyền kiểm soát 100% đối với phiên bản MEDIA mà mỗi dự án sử dụng. Subodules git là tuyệt vời, nhưng bạn cần thử nghiệm và tìm hiểu về chúng.

Với sức mạnh to lớn đến cơ hội tuyệt vời để bị cắn trong mông.


Quy trình công việc này nhắc nhở tôi về việc sử dụng một stackoverflow
cyrf

Nếu bạn thích mặc định là phiên bản mới nhất, bạn có thể thêm một tập lệnh để tuyên truyền cam kết MEDIA cho tất cả các dự án phụ thuộc.
jiggunjer

3
Làm thế nào để điều này tích hợp với github?
theonlygusti

26

Cân nhắc sử dụng cây con thay vì mô hình con, nó sẽ giúp cuộc sống người dùng repo của bạn dễ dàng hơn nhiều. Bạn có thể tìm thấy hướng dẫn chi tiết hơn trong cuốn sách Pro Git .


6
Đây là một bài viết thông tin khác về cây con so với mô hình con: blog.atlassian.com/2013/05/ Khăn
Benny Neugebauer

3
Theo bài viết đó, một trong những nhược điểm là:> Trách nhiệm không trộn lẫn mã siêu dự án và tiểu dự án nằm trong cam kết với bạn. Không ai có thời gian cho điều đó (IMO)
Robert Dundon

20

Nếu tôi hiểu rõ vấn đề của bạn, bạn muốn những điều sau đây:

  1. Có các tệp phương tiện của bạn được lưu trữ trong một kho lưu trữ git duy nhất, được sử dụng bởi nhiều dự án
  2. Nếu bạn sửa đổi tệp phương tiện trong bất kỳ dự án nào trong máy cục bộ của mình, tệp đó sẽ xuất hiện ngay lập tức trong mọi dự án khác (vì vậy bạn không muốn cam kết + đẩy + kéo mọi lúc)

Thật không may, không có giải pháp cuối cùng cho những gì bạn muốn, nhưng có một số điều mà bạn có thể làm cho cuộc sống của bạn dễ dàng hơn.

Trước tiên, bạn nên quyết định một điều quan trọng: bạn có muốn lưu trữ cho mọi phiên bản trong kho dự án của bạn một tham chiếu đến phiên bản của tệp phương tiện không? Vì vậy, ví dụ nếu bạn có một dự án có tên example.com, bạn có cần biết style.css nào được sử dụng 2 tuần trước hay mới nhất luôn luôn là (hoặc chủ yếu) là tốt nhất không?

Nếu bạn không cần phải biết điều đó, giải pháp rất dễ dàng:

  1. tạo một kho lưu trữ cho các tệp phương tiện và một cho mỗi dự án
  2. tạo một liên kết tượng trưng trong các dự án của bạn trỏ đến kho lưu trữ phương tiện nhân bản cục bộ. Bạn có thể tạo một liên kết tượng trưng tương đối (ví dụ ../media) và giả sử rằng mọi người sẽ kiểm tra dự án để thư mục phương tiện ở cùng một vị trí hoặc viết tên của liên kết tượng trưng vào .gitignore và mọi người có thể quyết định nơi anh / cô ấy đặt các tập tin phương tiện truyền thông.

Tuy nhiên, trong hầu hết các trường hợp, bạn muốn biết thông tin phiên bản này. Trong trường hợp này, bạn có hai lựa chọn:

  1. Lưu trữ mọi dự án trong một kho lưu trữ lớn. Ưu điểm của giải pháp này là bạn sẽ chỉ có 1 bản sao của kho phương tiện. Nhược điểm lớn là việc chuyển đổi giữa các phiên bản dự án khó hơn nhiều (nếu bạn thanh toán sang phiên bản khác, bạn sẽ luôn sửa đổi TẤT CẢ các dự án)

  2. Sử dụng mô hình con (như được giải thích trong câu trả lời 1). Bằng cách này, bạn sẽ lưu trữ các tệp phương tiện trong một kho lưu trữ và các dự án sẽ chỉ chứa một tham chiếu đến một phiên bản repo phương tiện cụ thể. Nhưng theo cách này, thông thường bạn sẽ có nhiều bản sao cục bộ của kho phương tiện và bạn không thể dễ dàng sửa đổi tệp phương tiện trong tất cả các dự án.

Nếu tôi là bạn, có lẽ tôi sẽ chọn giải pháp đầu tiên hoặc thứ ba (liên kết tượng trưng hoặc mô hình con). Nếu bạn chọn sử dụng mô hình con, bạn vẫn có thể làm rất nhiều thứ để làm cho cuộc sống của bạn dễ dàng hơn:

  1. Trước khi cam kết, bạn có thể đổi tên thư mục mô hình con và đặt liên kết tượng trưng vào thư mục phương tiện chung. Khi bạn đã sẵn sàng để cam kết, bạn có thể xóa liên kết tượng trưng và xóa mô hình con trở lại, sau đó cam kết.

  2. Bạn có thể thêm một trong các bản sao của kho lưu trữ phương tiện dưới dạng kho lưu trữ từ xa vào tất cả các dự án của bạn.

Bạn có thể thêm các thư mục cục bộ như một điều khiển từ xa theo cách này:

cd /my/project2/media
git remote add project1 /my/project1/media

Nếu bạn sửa đổi một tệp trong / my / project1 / media, bạn có thể cam kết nó và kéo nó từ / my / project2 / media mà không cần đẩy nó đến một máy chủ từ xa:

cd /my/project1/media
git commit -a -m "message"
cd /my/project2/media
git pull project1 master

Bạn có thể xóa những cam kết này sau (với git reset) vì bạn chưa chia sẻ chúng với những người dùng khác.


1
cho các dự án liên quan đến web nơi bạn làm việc từ bên trong Apache wwwthư mục, bạn nên đặt một .htaccesstập tin trong thư mục gốc của một trong hai wwwthư mục hoặc dự án của bạn, với Options +FollowSymLinkstrong nó, hoặc tốt hơn <IfModule mod_rewrite.c>{new line}Options +FollowSymLinks{new line}RewriteEngine on{new line}</IfModule> (thay thế {new line}với line` mới thực tế)

3

Tôi gặp vấn đề với cây con và mô hình con mà các câu trả lời khác gợi ý ... chủ yếu là vì tôi đang sử dụng SourceTree và nó có vẻ khá lỗi.

Thay vào đó, tôi đã kết thúc việc sử dụng SymLinks và điều đó dường như hoạt động tốt vì vậy tôi sẽ đăng nó ở đây như một sự thay thế có thể.

Có một hướng dẫn đầy đủ ở đây: http://www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/

Nhưng về cơ bản, bạn chỉ cần mklink hai đường dẫn trong một dấu nhắc lệnh nâng cao. Hãy chắc chắn rằng bạn sử dụng tiền tố liên kết cứng / J. Một cái gì đó dọc theo các dòng này: mklink / JC: \ dự án \ MainProject \ plugins C: \ dự án \ somePlugin

Bạn cũng có thể sử dụng các đường dẫn thư mục tương đối và đặt nó vào một con dơi để được thực thi bởi mỗi người khi họ lần đầu tiên kiểm tra dự án của bạn.

Ví dụ: mklink / J. \ Tài sản \ TaqtileTools .. \ TaqtileHoloTools

Khi thư mục đã được liên kết, bạn có thể cần bỏ qua thư mục trong kho lưu trữ chính đang tham chiếu đến thư mục đó. Nếu không thì bạn tốt để đi.

Lưu ý Tôi đã xóa câu trả lời trùng lặp của mình từ một bài đăng khác vì bài đăng đó được đánh dấu là một câu hỏi trùng lặp với bài này.

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.