Làm thế nào để có được cam kết nhất định từ dự án GitHub


151

Tôi cần tải xuống API Facebook từ GitHub . Thông thường, tôi chỉ cần nhấp vào tab 'Tải xuống "để tải xuống mã nguồn mới nhất. Trong trường hợp này, tôi cần một cam kết cũ hơn: 91f2564245 31030a454548693c3a6ca49ca3f35a , nhưng tôi không biết làm thế nào để có được toàn bộ dự án từ cam kết đó ...

Ai đó có thể vui lòng cho tôi biết làm thế nào để làm điều này?

(BTW, tôi đang sử dụng máy mac. Không biết điều đó có khác biệt gì không).


1
vui lòng xem stackoverflow.com/questions/13636559/ trên nếu bạn "chỉ" cần "zipped-snapshot-code".
Jean Fontaine

Câu trả lời:


216

Đầu tiên, sao chép kho lưu trữ bằng git, ví dụ:

git clone git://github.com/facebook/facebook-ios-sdk.git

Điều đó tải xuống lịch sử đầy đủ của kho lưu trữ, vì vậy bạn có thể chuyển sang bất kỳ phiên bản nào. Tiếp theo, thay đổi vào kho lưu trữ mới được nhân bản:

cd facebook-ios-sdk

... và sử dụng git checkout <COMMIT>để thay đổi thành đúng cam kết:

git checkout 91f25642453

Điều đó sẽ đưa ra cảnh báo, vì bạn không còn ở chi nhánh và đã chuyển trực tiếp sang một phiên bản cụ thể. (Trạng thái này được gọi là trạng thái "tách rời".) Vì có vẻ như bạn chỉ muốn sử dụng SDK này, thay vì chủ động phát triển nó, đây không phải là điều bạn cần lo lắng, trừ khi bạn quan tâm đến việc tìm hiểu thêm về cách hoạt động của git.


4
Tại thời điểm này, bạn cũng có thể git exportnếu bạn chỉ muốn các tập tin.
Xeoncross

1
git checkout -q <commit#>im lặng cảnh báo stderr trong quá trình kiểm tra git.
Manavalan Gajapathy

Khi tôi làm git checkout 441b034635240bc873700473af3e98533e94a0b5, điều này mang lại một lỗi: gây tử vong: tài liệu tham khảo không phải là một cây: 441b034635240bc873700473af3e98533e94a0b5
TTB

135

Tôi không biết liệu nó có ở đó khi bạn đăng câu hỏi này không, nhưng cách tốt nhất và dễ nhất để tải xuống một cam kết là nhấp vào tab cam kết khi xem kho lưu trữ. Sau đó, thay vì nhấp vào tên cam kết, hãy nhấp vào Duyệt kho lưu trữ tại thời điểm này trong nút lịch sử với biểu tượng <> ở bên phải của tên / thông báo cam kết và cuối cùng là nút Tải xuống ZIP xuất hiện khi bạn nhấp vào Sao chép hoặc Nút tải xuống .

Tôi hy vọng nó sẽ giúp các bạn.


3
Đây là cách duy nhất để khôi phục "các cam kết bị mất", đó là các cam kết mà github có lịch sử, nhưng đã bị xóa khỏi dòng thời gian git "chính thức". Sử dụng điều này, bạn có thể nhận được một ảnh chụp nhanh zip của một cam kết đã bị hủy bỏ vào quên lãng, đẩy cam kết đó đến một chi nhánh mới, đưa chi nhánh đó vào một repo hiện có và đưa nó trở lại tồn tại.
Ajax

@Ajax Điều đó không đúng. Bạn vẫn có thể nhận được sha bằng cách sử dụng git reflog, và sau đó kiểm tra cam kết tách ra
Aaron Brager

@AaronBrager chắc chắn, reflog sẽ hoạt động, NẾU bạn đang ở trên cùng một máy đã có cam kết ban đầu. OP đã biết cam kết, vì vậy họ sẽ không cần reflog và chỉ có thể thanh toán trực tiếp. Tuy nhiên, tôi đang nói về những trường hợp bạn không có cam kết tại địa phương và nó không thuộc bất kỳ chi nhánh nào vẫn còn trong repo công khai. Trong những trường hợp này, github vẫn có thể có một bản ghi về cam kết mà bạn có thể tải xuống dưới dạng zip để có thể khôi phục cam kết đã nói.
Ajax

@Ajax Ah, cảm ơn đã làm rõ. Là một thay thế, bạn có thể nhấn API GitHub ( api.github.com/repos/facebook/facebook-ios-sdk/events ) và tạo ra một chi nhánh từ mồ côi cam kết ( hướng dẫn tại đây )
Aaron Brager

Rất đẹp. +1 Tôi không biết bạn có thể truy vấn reflog của github như thế!
Ajax

27

Câu trả lời của Sivan trong gif nhập mô tả hình ảnh ở đây

1. Nhấp vào cam kết trong github

2.Chọn Duyệt mã ở bên phải của mỗi cam kết

3. Nhấp vào zip tải xuống, sẽ tải xuống mã nguồn tại thời điểm cam kết


Xin chào suraj bạn có thể vui lòng cho tôi biết bạn đã tạo gif màn hình của bạn như thế nào không?
Rahul Satal

sử dụng trình phát thời gian nhanh để quay video màn hình. Chuyển đổi video thành gif bằng bất kỳ công cụ có sẵn nào. Google nó. @ Rahul Satal
Suraj K Thomas

1
Cảm ơn @SurajKThomas cho gif
Sivan

10

Để chỉ tải xuống một cam kết sử dụng mẫu ngắn SHA1 gồm 7 chữ số, hãy làm:

Ví dụ làm việc:

https://github.com/python/cpython/archive/31af650.zip  

Sự miêu tả:

 `https://github.com/username/projectname/archive/commitshakey.zip`

Nếu bạn có khóa băm dài 31af650ee25f65794b75d4dfefed6fe4758781c1, chỉ cần lấy 7 ký tự đầu tiên 31af650. Đây là mặc định cho GitHub.


8

Cách dễ nhất mà tôi tìm thấy để khôi phục một cam kết bị mất (chỉ tồn tại trên github chứ không phải cục bộ) là tạo một nhánh mới bao gồm cam kết này.

  1. Có cam kết mở (url như: github.com/org/repo/commit/long-commit-sha)
  2. Nhấp vào "Duyệt tệp" ở trên cùng bên phải
  3. Nhấp vào menu thả xuống "Cây: short-sha ..." ở trên cùng bên trái
  4. Nhập tên chi nhánh mới
  5. git pull chi nhánh mới xuống địa phương

Câu trả lời này là tổng quát hơn so với câu trả lời. Tôi đã gặp tình huống này rằng cam kết mà tôi muốn đã biến mất trên nhánh chính và Github sẽ không giữ mọi cam kết trên các nhánh không tồn tại. Vì vậy, cách tiếp cận này sẽ tạo ra một nhánh mới từ cam kết đó trên Github và làm cho nó có thể kéo được.
Qi Luo

Điều này cho phép tôi khôi phục một cam kết (với SHA ban đầu còn nguyên vẹn) từ một ngã ba đã bị xóa mà tôi đã thực hiện PR từ đó. Sau khi tạo một ngã ba mới, tôi đã mở cam kết PR trên repo ngược dòng sau đó đã "duyệt tệp". Sau đó tôi đã sao chép URL đó và thay thế tên người dùng bằng tên của mình. Sau đó nhấp vào Cây: thả xuống và tạo một nhánh mới trong ngã ba của tôi. Làm việc tuyệt vời!
Allen Luce

2

Tiêu đề câu hỏi mơ hồ.


1

Ngoài câu trả lời được chấp nhận:

Để xem các giá trị băm, bạn cần sử dụng lệnh được đề xuất "git checkout hash ", bạn có thể sử dụng git log. Tuy nhiên, tùy thuộc vào những gì bạn cần, có một cách dễ dàng hơn so với băm sao chép / dán.

Bạn có thể sử dụng git log --onelineđể đọc nhiều tin nhắn cam kết ở định dạng nén hơn.

Hãy nói rằng bạn thấy đây là danh sách một dòng các cam kết với thông tin tối thiểu và chỉ băm có thể nhìn thấy một phần:

hash111 (HEAD -> master, origin/master, origin/HEAD)
hash222 last commit
hash333 I want this one
hash444 did something
....

Nếu bạn muốn last commit, bạn có thể sử dụng git checkout master^. Việc ^cung cấp cho bạn các cam kết trước khi chủ. Vì vậy hash222.

Nếu bạn muốn cam kết cuối cùng thứ n, bạn có thể sử dụng git checkout master~n. Ví dụ, sử dụng git checkout master~2sẽ cung cấp cho bạn các cam kết hash333.


0

Thay vì điều hướng qua các xác nhận, bạn cũng có thể nhấn yphím ( Trợ giúp Github , Phím tắt ) để nhận "permalink" cho sửa đổi / cam kết hiện tại.
Điều này sẽ thay đổi URL từ https://github.com/<user>/<repository>(chính / CHÍNH) thành https://github.com/<user>/<repository>/tree/<commit id>.

Để tải xuống cam kết cụ thể, bạn sẽ cần tải lại trang từ URL đó, vì vậy Clone or Downloadnút sẽ trỏ đến "ảnh chụp nhanh" https://github.com/<user>/<repository>/archive/<commit id>.zip thay vì mới nhất https://github.com/<user>/<repository>/archive/master.zip.


0

Hãy thử chuỗi lệnh sau:

$ git fetch origin <copy/past commit sha1 here>
$ git checkout FETCH_HEAD
$ git push origin master

-1

Nếu bạn muốn thực hiện với bất kỳ cam kết nào hoặc muốn mã hóa bất kỳ cam kết nào thì bạn có thể sử dụng lệnh dưới đây:

git checkout <BRANCH_NAME>
git reset --hard  <commit ID which code you want>
git push --force

Thí dụ:

 git reset --hard fbee9dd 
 git push --force

2
Điều này thật nguy hiểm, sẽ hợp lý hơn khi sao chép repo và kiểm tra phiên bản
user1767754 11/07/17
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.