2012-01-19 27 views
17

Tôi muốn sao chép hạt nhân Linux repo, nhưng chỉ từ phiên bản 3.0 trở đi, vì repo hạt nhân là rất lớn nó làm cho các công cụ phiên bản của tôi chạy nhanh hơn nếu tôi có thể làm một bản sao nông. Cốt lõi của câu hỏi của tôi là: làm thế nào tôi có thể cho git biết giá trị "n" là gì cho tham số --depth? Tôi đã hy vọng điều này sẽ làm việc:git nông clone vào thẻ cụ thể

git clone http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --depth v3.0

nhờ.

+0

Xem thêm [Làm cách nào để xóa lịch sử cũ khỏi kho lưu trữ git?] (Http://stackoverflow.com/questions/4515580/how-do-i-remove-the-old-history-from-a- git-repository) – Alberto

Trả lời

2

Thật không may thông số --depth của git clone chỉ chấp nhận một số, số lần sửa đổi mà kho lưu trữ nhân bản sẽ bị cắt bớt.

Một giải pháp có thể là sao chép toàn bộ kho lưu trữ, sau đó cắt bớt lịch sử của nó để chỉ giữ lại các cam kết sau v3.0. Đây là một tốt how-to: http://bogdan.org.ua/2011/03/28/how-to-truncate-git-history-sample-script-included.html

git checkout --orphan temp v3.0 
git commit -m "Truncated history" 
git rebase --onto temp v3.0 master 
git branch -D temp 
git gc 
+0

Điều đó sẽ hoạt động tốt như giải pháp mà tôi đã cung cấp, nhưng tôi cũng khuyên bạn nên xóa tất cả các tham chiếu cục bộ khác và chạy các bước dọn dẹp mà tôi có trong giải pháp của mình. Nếu không có điều đó, repo sẽ vẫn chứa toàn bộ lịch sử và các đối tượng phụ. Với repo này là khoảng 2 triệu đối tượng treo xung quanh hơn cần thiết. – James

+0

Ghi chú tốt, được thêm – tomgi

+0

Chiến lược này yêu cầu quản lý việc hợp nhất xung đột và chạy nguy cơ sản xuất không phải là bản sao chính xác của tổng thể cuối cùng tùy thuộc vào cách hợp nhất được xử lý. Vì repo quá lớn nên rất khó có thể thực hiện việc sáp nhập bằng tay để bạn có thể thêm tùy chọn '-Xours' hoặc' -Xtheirs' vào lệnh rebase. Tôi chắc rằng bạn sẽ tìm thấy kết quả cuối cùng khác với nguồn của nguồn gốc chính. – James

7

đã đọc đầy đủ cho một giải pháp, nhưng không may, git clone không hoạt động trong thời trang mà bạn yêu cầu. Thông số --depth giới hạn số lượng revisions không phải là số commits. Không có một tham số nhân bản giới hạn số tiền cam kết. Trong trường hợp của bạn, ngay cả khi bạn biết rằng chỉ có tối đa 10 bản sửa đổi khác nhau từ tệp đã thay đổi nhiều nhất giữa v3.0 và HEAD mới nhất trong repo và sử dụng --depth 10 bạn vẫn có thể nhận được nhiều nhất hoặc toàn bộ lịch sử repo. Bởi vì một số đối tượng có thể không có nhiều như 10 sửa đổi và bạn sẽ có được lịch sử của họ tất cả các cách trở lại đầu sự xuất hiện đầu tiên của họ trong repo.

Bây giờ, đây là cách làm những gì bạn thích: Chìa khóa cho vấn đề của bạn là bạn cần cam kết giữa v3.0 và tham chiếu gần đây nhất mà bạn muốn. Dưới đây là các bước tôi đã làm để làm việc đó:

  • git clone http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --depth 10075 smaller_kernel_repo
  • cd smaller_kerenel_repo
  • Xác định sha của v3.0 git log --oneline v3.0^..v3.0
  • Tạo một điểm ghép bắt đầu với sha này (nó là 02f8c6aee8df3cdc935e9bdd4f2d020306035dbe)
  • echo "02f8c6aee8df3cdc935e9bdd4f2d020306035dbe" > .git/info/grafts
  • Để khắc phục một số vấn đề với một số mục nhập nhật ký hạt nhân, hãy thực hiện: export GIT_AUTHOR_NAME="tmp"export GIT_COMMITTER_NAME="tmp"

  • Có một cảnh báo tốt đẹp về người đàn ông trong trang về git filter-branch viết lại lịch sử bằng cách làm theo điểm ghép ... do đó, cho phép lạm dụng điều đó, bây giờ chạy git filter-branch và ngồi lại và chờ đợi ... (và chờ chờ)

Bây giờ bạn cần để làm sạch tất cả mọi thứ:

git reflog expire --expire=now --all 
git repack -ad # Remove dangling objects from packfiles 
git prune  # Remove dangling loose objects 

quá trình này rất tốn thời gian nhưng không phải là rất phức tạp. Hy vọng rằng nó sẽ giúp bạn tiết kiệm tất cả thời gian bạn đã hy vọng trong thời gian dài. Tại thời điểm này, bạn sẽ có cơ bản là một repo với một lịch sử sửa đổi chỉ v3.0 trở đi từ repo linux-stable.git.Cũng giống như nếu sử dụng các --depth trên bản sao bạn có cùng một hạn chế về repo và sẽ chỉ có thể sửa đổi và gửi các bản vá lỗi từ lịch sử bạn đã có. Có những cách xung quanh đó .. nhưng nó xứng đáng với riêng của mình Q & A.

Tôi đang trong quá trình thử nghiệm vài bước cuối cùng, nhưng hoạt động git filter-branch vẫn đang diễn ra. Tôi sẽ cập nhật bài đăng này với bất kỳ vấn đề nào, nhưng tôi sẽ tiếp tục và đăng nó để bạn có thể bắt đầu quá trình này nếu bạn thấy nó có thể chấp nhận được.

CẬP NHẬT

Giải pháp cho vấn đề (tử vong: trống ident <> không được phép). Vấn đề này xuất phát với một vấn đề trong lịch sử cam kết của repo Linux.

Thay đổi lệnh git filter-branch tới:

git filter-branch --commit-filter ' 
    if [ "$GIT_AUTHOR_EMAIL" = "" ]; 
    then 
      GIT_AUTHOR_EMAIL="[email protected]"; 
      GIT_AUTHOR_NAME='tmp' 
      GIT_COMMITTER_NAME='Me' 
      GIT_COMMITTER_EMAIL='[email protected]' 
      git commit-tree "[email protected]"; 
    else 
      git commit-tree "[email protected]"; 
    fi ' 
+1

Tôi nghĩ rằng đó là những điều quá phức tạp để phân biệt nghiêm ngặt giữa * sửa đổi * và * cam kết * tại đây. Trong khi tôi biết [sự khác biệt chính thức] (http://stackoverflow.com/a/11792712/1127485), trong ngữ cảnh của 'git clone --depth ' số lần sửa đổi bằng với số lần cam kết từ lời khuyên. – sschuberth

0

Tham số --depth có vẻ là chỉ có một số (các "quy định số các phiên bản"), không phải là một thẻ.

Có thể ý tưởng (để được kiểm tra):

Bạn có thể sử dụng git describe mặc dù để có được thẻ mới nhất từ ​​bạn hiện tại HEAD, cũng như số lượng các cam kết giữa nói và thẻ HEAD.
Nếu "thẻ gần đây nhất" không phải là thẻ của bạn, chỉ cần lặp lại quy trình, bắt đầu từ cam kết được tham chiếu bằng thẻ mới nhất đó, cho đến khi bạn tìm thấy thẻ của mình (ví dụ: v3.0).

Tổng của tất cả các số cam kết đó sẽ cung cấp cho bạn độ sâu để cung cấp cho lệnh git clone, miễn là thẻ của bạn có thể truy cập từ HEAD hiện tại của bạn.

17

Làm cách nào để sao chép thẻ ở độ sâu 1?

  • git clone --branch mytag0.1 --depth 1 https://example.com/my/repo.git
+0

Làm thế nào điều này ** KHÔNG ** câu trả lời được chấp nhận? – tftd

1

Đối với những người đã có một bản sao lệnh này sẽ nhận được số cam kết giữa đỉnh của chi nhánh hiện tại và thẻ 5.6:

$ git rev-list HEAD ^5.6 --count 
407 

tôi thấy dự án này thực hiện danh sách rev sử dụng API GitHub: https://github.com/cjlarose/github-rev-list

Trang người rất dài trên rev-list cho biết có rất nhiều thứ xảy ra đằng sau hậu trường. Có rất nhiều con đường khác nhau để có thể đếm cam kết thông qua các chi nhánh và hợp nhất sắp tới và đi. (?) Đối với trường hợp sử dụng này dù rằng có lẽ có thể được bỏ qua

0

Để làm @ n8henrie trả lời hoàn chỉnh hơn một chút, bạn có thể thêm tùy chọn --single-branch, như thế này:

git clone --single-branch --branch mytag0.1 --depth 1 https://example.com/my/repo.git 

Trong đây là bạn chỉ nhận được các đối tượng kho lưu trữ liên quan đến thẻ cụ thể này, theo kinh nghiệm của tôi, trong nhiều trường hợp, phụ thuộc khá nhiều không gian.Từ git-clone docs:

- [không-] đơn chi nhánh

Clone chỉ lịch sử dẫn đến đỉnh của một chi nhánh duy nhất, hoặc theo quy định của --branch tùy chọn hoặc các chi nhánh từ xa chính của HEAD điểm tại. Việc tìm nạp thêm vào kho lưu trữ kết quả sẽ chỉ cập nhật nhánh theo dõi từ xa cho nhánh mà tùy chọn này được sử dụng cho nhân bản ban đầu. Nếu HEAD ở điều khiển từ xa không trỏ đến bất kỳ chi nhánh nào khi --single-branch sao chép được tạo, không có nhánh theo dõi từ xa nào được tạo.

Một lưu ý thêm: nếu bạn đang nhân rộng một repo địa phương từ một thư mục khác trong cùng một máy tính, nó là cần thiết để đề cập đến nó bằng cách sử dụng giao thức file://, thay vì quy định cụ thể chỉ tên thư mục.

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