Tải xuống một thư mục hoặc thư mục từ repo GitHub


1106

Làm cách nào tôi chỉ có thể tải xuống một thư mục hoặc thư mục cụ thể từ repo Git từ xa được lưu trữ trên GitHub?

Nói ví dụ repo GitHub sống ở đây:

git@github.com:foobar/Test.git

Cấu trúc thư mục của nó:

Test/
├── foo/ 
│   ├── a.py
│   └── b.py   
└── bar/
    ├── c.py
    └── d.py

Tôi muốn chỉ tải xuống thư mục foo và không sao chép toàn bộ dự án Test.


4
Tôi đã viết một kịch bản shell cho việc này bằng cách sử dụng kiểm tra svn - github.com/Decad/github-doader
Declan Cook

391
Ai đó có thể giải thích cho tôi tại sao không có giải pháp giao diện web "chính thức" cho vấn đề này không? Nó có vẻ như là một tính năng tầm thường để thực hiện, nhưng siêu hữu ích.
Alexander - Hồi phục lại

3
Tôi đã phát triển một tiện ích mở rộng chrome bằng cách sử dụng gitzip của KinoLien. github.com/charany1/GHSDD
charany1

3
xem @janos trả lời svn thay thế là tốt nhất, không xác thực, không đăng ký, không giới hạn, không bổ trợ
stackdave

5
Tôi đã tạo ra một giải pháp gọn nhẹ cho việc này ( download-directory.github.io ) và nó được tích hợp trong GitHub tinh chỉnh
fregante

Câu trả lời:


1034

Cập nhật tháng 9 năm 2016: có một vài công cụ được tạo bởi cộng đồng có thể làm điều này cho bạn:


Git không hỗ trợ điều này, nhưng Github thực hiện thông qua SVN. Nếu bạn kiểm tra mã của mình bằng subversion, Github về cơ bản sẽ chuyển đổi repo từ git sang subversion trên phụ trợ, sau đó phục vụ thư mục được yêu cầu.

Đây là cách bạn có thể sử dụng tính năng này để tải xuống một thư mục cụ thể. Tôi sẽ sử dụng thư viện javascript phổ biến lodashlàm ví dụ.

  1. Điều hướng đến thư mục bạn muốn tải xuống . Hãy tải về /testtừ masterchi nhánh. ví dụ URL repo github

  2. Sửa đổi URL cho lật đổ . Thay thế tree/masterbằng trunk.

    https://github.com/lodash/lodash/tree/master/test

    https://github.com/lodash/lodash/trunk/test

  3. Tải về thư mục . Đi đến dòng lệnh và lấy thư mục với SVN.

svn checkout https://github.com/lodash/lodash/trunk/test

Bạn có thể không thấy bất kỳ hoạt động nào ngay lập tức vì Github mất tới 30 giây để chuyển đổi các kho lưu trữ lớn hơn, vì vậy hãy kiên nhẫn.

Giải thích định dạng URL đầy đủ:

  • Nếu bạn quan tâm đến masterchi nhánh, sử dụng trunkthay thế. Vì vậy, đường dẫn đầy đủ làtrunk/foldername
  • Nếu bạn quan tâm đến foochi nhánh, sử dụng branches/foothay thế. Đường dẫn đầy đủ trông giống nhưbranches/foo/foldername
  • Protip: Bạn có thể sử dụng svn lsđể xem các thẻ và chi nhánh có sẵn trước khi tải xuống nếu muốn

Đó là tất cả! Github cũng hỗ trợ nhiều tính năng lật đổ hơn , bao gồm hỗ trợ cam kết và đẩy các thay đổi.


162
Tuyệt vời, chỉ cần thay thế tree/masterbằng trunkvà bạn có thể nhận được thư mục cụ thể.
Sérgio Michels

6
Cảm ơn @ user1146881 và @ SérgioMichels, bạn phải thay thế tree/masterbằng trunk. Thông tin này nên được thêm vào trong câu trả lời.
baptx

8
Tôi đã sửa đổi điều này để sử dụng svn export, vì tôi không muốn một bản sao hoạt động của Subversion. Sau đó, tôi đã thêm thư mục kết quả trong Git. (Bằng cách nào đó tôi đã mất một phần lớn cây thư mục của mình, vì vậy tôi đã xuất từ ​​repo mà tôi đã rẽ nhánh.)
Grault 18/12/13

5
@ num3ric- xin lỗi vì đã trả lời trễ, nhưng bạn sẽ có thể thay thế "thân cây" bằng "chi nhánh / yourbranch"
nick

2
@ElijahLynn Cảm ơn bạn đã chỉnh sửa, tôi nên có thông tin đó! Mặc dù có 2 điều - tôi đã chấp nhận chỉnh sửa của bạn nhưng đã lấy lại một số thứ của riêng tôi (có nghĩa là để thực hiện điều này dù sao đi nữa, nó cảm thấy quá lộn xộn). Ngoài ra, tôi đã thay đổi branchđường dẫn của bạn branches, mà tôi nghĩ là chính xác; nếu không, hãy tiếp tục và thay đổi nó trở lại.
nick

567

Hai tùy chọn cho tính năng này:

Tùy chọn 1: Tiện ích mở rộng trình duyệt GitZip

Tiện ích mở rộng Chrome , Addon Firefox

Sử dụng:

  1. Trong bất kỳ trang repos GitHub.
  2. Chỉ cần nhấp đúp chuột vào phần trống của các mục bạn cần.
  3. Nhấp vào nút tải xuống ở dưới cùng bên phải.
  4. Xem bảng điều khiển tiến trình và chờ tải xuống kích hoạt trình duyệt.
  5. Lấy tập tin ZIP.

Nhận được mã thông báo:

  1. Nhấp vào biểu tượng Tiện ích mở rộng GitZip trên trình duyệt của bạn.
  2. Nhấp vào liên kết "Bình thường" hoặc "Riêng tư" bên cạnh "Nhận mã thông báo".
  3. Cho phép GitZip trên trang xác thực Github.
  4. Quay lại trang repo của sự khởi đầu.
  5. Tiếp tục sử dụng.

Tùy chọn 2: Github gh-page

http://kinolien.github.io/gitzip bằng cách sử dụng các thư viện GitHub API và JSZip, FileSaver.js.

Bước 1: Nhập url github vào trường ở góc trên bên phải.
Bước2: Nhấn enter hoặc nhấp vào tải xuống để tải xuống zip trực tiếp hoặc nhấp vào tìm kiếm để xem danh sách các thư mục con và tệp.
Bước 3: Nhấp vào nút "Tải xuống tệp Zip" hoặc nút "Tải tệp" để nhận tệp.

Trong hầu hết các trường hợp, nó hoạt động tốt, ngoại trừ thư mục chứa hơn 1.000 tệp, do giới hạn API của Github Plants. (tham khảo Github API # Nội dung )

Và nó cũng có thể hỗ trợ repos riêng / công khai và nâng cấp giới hạn tỷ lệ, nếu bạn có tài khoản GitHub và sử dụng liên kết "get token" trong trang web này.


5
Điều này thật tuyệt vời, nhưng có vẻ như nhu cầu của nó rất lớn, nhu cầu của bạn đang đẩy bạn lên trên tài khoản của bạn và vì vậy nó không còn hoạt động nữa ;-) Thật tuyệt vời khi có thể đăng nhập với GitHub oAuth - điều này sẽ cho phép hỗ trợ repo riêng tư, đồng thời cũng phát sinh giới hạn tỷ lệ của bạn vì chúng sẽ được yêu cầu xác thực
hobailey

3
@hobailey Bây giờ, nó có thể nhận được mã thông báo truy cập để tăng giới hạn tỷ lệ và cũng có thể truy cập các kho riêng.
Kino

1
@MYounas Xem về các chương OAuth, Cây, Blobs trong Github API Doc. và cũng sử dụng các thư viện js của JSZip, FileSaver.js để triển khai gitzip.
Kino

1
Bất cứ ai b quan tâm đến một phần mở rộng chrome mà làm điều này?
goldylucks

4
Điều này thực sự cần phải được thêm vào trang web github thực tế, nó cực kỳ hữu ích.
cuộn

508

Tới DownGit > Nhập URL của bạn> Tải về!

Giờ đây, bạn có thể TẢI XUỐNG TRỰC TIẾP hoặc tạo LIÊN KẾT TẢI XUỐNG cho bất kỳ thư mục hoặc tệp công khai GitHub nào (tệp đặc biệt lớn ) từ DownGit ! Đây là một minh chứng đơn giản-


Xuống


Bạn cũng có thể định cấu hình cách sử dụng thuộc tính của tệp đã tải xuống .


2
Bro, ý tôi là cách tạo dự án như DownGit mà bạn đã tạo.
Muhammad Younus

12
Phương thức cơ bản là- 1. lấy liên kết thư mục (đã sử dụng angular-route ), 2. đi tới GitHub API , 3. tìm kiếm qua thư mục và tải xuống tất cả các tệp, 4. tạo một tệp zip với nó (Tôi đã sử dụng jszip ) & lưu nó dưới dạng tệp (sử dụng trình bảo vệ tệp cho việc này). Để hiểu rõ hơn tôi sẽ đề nghị xem xét trong dự án của tôi .
Minhas Kamal

1
thanx Bro để được hướng dẫn chi tiết, tôi rất biết ơn bạn nếu bạn đề xuất bất kỳ hướng dẫn hoặc liên kết.
Muhammad Younus

5
Điều này thật tuyệt nhưng nó không hoạt động với các công cụ tự động (như wget)
Đổ chuông

1
Điều này bị treo downloaded 25 of 25 fileskhi tôi thử tải xuống từ URL này: github.com/dssg/hitchhikers-guide/tree/master/curemony/
Lỗi

164

Nếu bạn có svn, bạn có thể sử dụng svn exportđể làm điều này:

svn export https://github.com/foobar/Test.git/trunk/foo

Lưu ý định dạng URL:

  • URL cơ sở là https://github.com/
  • /trunk ở cuối

Trước khi bạn chạy svn export, trước tiên hãy xác minh nội dung của thư mục bằng:

svn ls https://github.com/foobar/Test.git/trunk/foo

Điều này vẫn còn hoạt động? Đã thử điều này với TortiseSVN và tôi gặp lỗi về quyền, yêu cầu tôi cung cấp thông tin đăng nhập.
John

2
@john Tôi chắc chắn rằng điều này là quá muộn để được giúp đỡ nhiều, nhưng bạn có bật xác thực 2 yếu tố trên tài khoản GitHub của mình không? Nếu vậy, tôi nghĩ rằng tôi đã đọc ở đâu đó bạn sẽ phải sử dụng khóa được tạo trước cho mật khẩu (mà bạn sẽ cần tìm trong cài đặt GitHub).
nick

1
Về định dạng URL, bạn có thể giữ .gitphần mở rộng. Bạn có thể sử dụng liên kết dự án đầy đủ và bắt đầu bằng cách sử dụng svn lstheo sau là đường dẫn đầy đủ của dự án. Ví dụ : svn ls https://github.com/RobTillaart/Arduino.git. Để xuất chỉ một thư mục, bạn chỉ cần thêm /trunktheo sau bởi đường dẫn mong muốn, như thế nào svn export https://github.com/RobTillaart/Arduino.git/trunk/libraries/DHTlib. Nó dễ dàng hơn để giữ cho đường dẫn dự án nguyên vẹn.
jgrocha

@jgrocha Tôi không chắc nó đã hoạt động như vậy vào năm 2013, nhưng hiện tại thì cảm ơn, đã cập nhật bài đăng
janos

1
Một ví dụ: để tải nội dung trong https://github.com/miguelgrinberg/python-socketio/tree/master/examples/wsgi, chạy svn export https://github.com/miguelgrinberg/python-socketio.git/trunk/examples/wsgi. Một thư mục được gọi wsgisẽ được tạo trong thư mục làm việc hiện tại. Chỉ có tập tin nguồn, không có gì khác. Không .git, không có tập tin liên quan lật đổ.
Rockallite

74

Đối với một Repo git chung:

Nếu bạn muốn tải xuống các tệp, không sao chép kho lưu trữ với lịch sử, bạn có thể thực hiện việc này với git-archive.

git-archivelàm cho một nén zip hoặc lưu trữ tar của một kho lưu trữ git. Một số điều làm cho nó đặc biệt:

  1. Bạn có thể chọn tập tin hoặc thư mục nào trong kho git để lưu trữ.
  2. Nó không lưu trữ .git/thư mục hoặc bất kỳ tệp nào chưa được theo dõi trong kho lưu trữ mà nó chạy.
  3. Bạn có thể lưu trữ một chi nhánh, thẻ hoặc cam kết cụ thể. Các dự án được quản lý bằng git thường sử dụng điều này để tạo lưu trữ các phiên bản của dự án (beta, phát hành, 2.0, v.v.) để người dùng tải xuống.

Một ví dụ về việc tạo một kho lưu trữ docs/usagethư mục từ một repo từ xa mà bạn đã kết nối với ssh:

# in terminal
$ git archive --format tar --remote ssh://server.org/path/to/git HEAD docs/usage > /tmp/usage_docs.tar

Thêm thông tin trong bài viết blog nàytài liệu git .

Lưu ý về Repit GitHub:

GitHub không cho phép git-archivetruy cập . ☹️


2
git archive --format tarđịnh dạng không phải là tar.gz, mà là tar.
出 羽 和

Đây phải là câu trả lời tốt nhất
Felipe Costa

2
Tôi nghĩ rằng đây là câu trả lời tốt nhất nhưng hãy lưu ý rằng lệnh git archive không hoạt động với giao thức https.
bitfox

@yukihane đã chỉnh sửa tiện ích mở rộng từ tar.gz sang tar, hy vọng OP có mặt trên này
mihai

36

Tôi đã tạo một dự án nguồn mở, được gọi là GitHubFolderDoader . Nó cho phép bạn tải xuống một thư mục duy nhất của kho lưu trữ mà không cần sao chép hoặc tải xuống toàn bộ kho lưu trữ.


Hoạt động tuyệt vời nếu bạn chỉ cần tải xuống các thư mục từ GitHub. Nó chỉ cần một mã thông báo Github để tải xuống thư mục mong muốn. Nhiều upvote có thể cung cấp cho câu trả lời này một số nổi bật.
Alex Essilfie

34

Không có gì sai với các câu trả lời khác nhưng tôi chỉ nghĩ rằng lần đầu tiên tôi chia sẻ hướng dẫn từng bước cho những người lang thang trong quá trình này.

Cách tải xuống một thư mục từ kho lưu trữ github (Mac OS X):

~ Để mở Terminal, chỉ cần nhấp vào spotlight và gõ terminal sau đó nhấn enter

  1. Trên máy Mac, bạn có thể đã có SVN (để kiểm tra chỉ cần mở terminal và gõ "svn" hoặc "which svn" ~ mà không có dấu ngoặc kép)
  2. Trên Github: Xác định vị trí đường dẫn Github vào thư mục git của bạn (không phải repo) bằng cách nhấp vào tên thư mục cụ thể trong repo
  3. Sao chép đường dẫn từ thanh địa chỉ của trình duyệt
  4. Mở Terminal và gõ: svn export
  5. Dán tiếp theo vào địa chỉ (ví dụ:): https://github.com/mingsai/Sample-Code/tree/master/HeadsUpUI
  6. Thay thế các từ: cây / chủ
  7. với từ: thân cây
  8. Nhập vào thư mục đích cho các tệp (trong ví dụ này, tôi lưu trữ thư mục đích bên trong thư mục Tải xuống cho người dùng hiện tại)
  9. Ở đây, không gian chỉ là phím cách chứ không phải từ (dấu cách) ~ / Tải xuống / HeadsUpUI
  10. Lệnh cuối cùng hiển thị lệnh đầy đủ để tải xuống thư mục (so sánh địa chỉ với bước 5) svn export https://github.com/mingsai/Sample-Code/trunk/HeadsUpUI ~ / Tải xuống / HeadsUpUI

BTW - Nếu bạn đang ở trên Windows hoặc một số nền tảng khác, bạn có thể tìm thấy bản tải xuống nhị phân của subversion (svn) tại http://subversion.apache.org

~ Nếu bạn muốn kiểm tra thư mục thay vì chỉ đơn giản là tải xuống, hãy thử sử dụng trợ giúp svn (tldr: thay thế xuất bằng thanh toán )

Cập nhật

Về nhận xét về việc tiếp tục tải xuống / kiểm tra bị gián đoạn. Tôi sẽ thử chạy svn cleanuptheo sau svn update. Vui lòng tìm kiếm SO cho các tùy chọn bổ sung.


1
Tôi phải tải xuống nhiều tệp từ một thư mục cụ thể và gặp lỗi này ở giữa quá trình tải xuống: svn: E175002: BÁO CÁO của '/ bgmartins / scripts-parlamento /! Svn / vcc / default': 200 OK ( github.com ) Bạn có thể tiếp tục tải xuống không?
Miguel

Đã làm cho tôi. Thật đáng kinh ngạc.
Heath Raftery

24

Bất cứ ai đang làm việc trên thư mục cụ thể, anh ta cần sao chép chính thư mục cụ thể đó, để làm như vậy, vui lòng làm theo các bước dưới đây bằng cách sử dụng kiểm tra thưa thớt.

  1. Tạo một thư mục.

  2. Khởi tạo một kho lưu trữ Git. ( git init)

  3. Cho phép kiểm tra thưa thớt. ( git config core.sparsecheckout true)

  4. Nói cho Git biết thư mục nào bạn muốn (echo 2015 / brand / May (tham khảo thư mục bạn muốn làm việc) >> .git/info/sparse-checkout)

  5. Thêm điều khiển từ xa ( git remote add -f origin https://jafartke.com/mkt-imdev/DVM.git)

  6. Lấy các tệp ( git pull origin master)


Quá tệ, bình luận này đã không nhận được đủ số lượt ủng hộ. Có vẻ như giải pháp được cung cấp áp dụng cho tất cả các kho git chứ không chỉ riêng kho github.
Kalyan

9
Điều này không thực sự làm những gì mong muốn, mặc dù. Nó vẫn nhân bản toàn bộ kho lưu trữ, nó chỉ không kiểm tra một số thư mục.
Chris

Đã giải quyết tại đây: stackoverflow.com/questions/4114887/ Mạnh
JK

Tôi nhận được lỗi này: Thanh toán thưa thớt không có mục trên thư mục làm việc.
orangecaterpillar

20

Bạn không thể; Không giống như Subversion, nơi mỗi thư mục con có thể được kiểm tra riêng lẻ, Git hoạt động trên cơ sở toàn bộ kho lưu trữ.

Đối với các dự án khi cần truy cập chi tiết hơn, bạn có thể sử dụng các mô hình con - mỗi mô hình con là một dự án Git riêng biệt và do đó có thể được nhân bản riêng lẻ.

Có thể hình dung rằng giao diện người dùng Git (ví dụ: giao diện web của GitHub hoặc gitweb) có thể chọn cung cấp giao diện để bạn trích xuất một thư mục nhất định, nhưng theo hiểu biết của tôi thì không ai trong số họ làm điều đó (mặc dù họ cho phép bạn tải xuống các tệp riêng lẻ , vì vậy nếu thư mục không chứa quá nhiều tệp, đó là một tùy chọn)

Chỉnh sửa - GitHub thực sự cung cấp quyền truy cập thông qua SVN, điều này sẽ cho phép bạn thực hiện việc này (theo nhận xét). Xem https://github.com/blog/1438-improved-svn-here-to-stay-old-svn- gửi-Away để biết hướng dẫn mới nhất về cách thực hiện việc này


Có điều gì thông qua API github không?
g_inherit

14

Nếu bạn thực sự chỉ muốn "tải xuống" thư mục và không "sao chép" nó (để phát triển), cách đơn giản nhất là lấy một bản sao của phiên bản mới nhất của kho lưu trữ (và do đó là một thư mục / tệp trong đó), mà không cần sao chép toàn bộ repo hoặc thậm chí cài đặt git ở vị trí đầu tiên, là tải xuống một kho lưu trữ zip (cho bất kỳ repo, fork, chi nhánh, cam kết, v.v.) bằng cách đi đến kho / fork / chi nhánh / cam kết mong muốn trên GitHub (ví dụ: http(s)://github.com/<user>/<repo>/commit/<Sha1>đối với một bản sao của các tệp như sau một cam kết cụ thể) và chọn Downloadsnút gần phía trên bên phải.

Định dạng lưu trữ này không chứa ma thuật git-repo, chỉ các tệp được theo dõi (và có thể là một vài tệp .gitignore nếu chúng được theo dõi, nhưng bạn có thể bỏ qua các tệp đó: p) - điều đó có nghĩa là nếu mã thay đổi và bạn muốn luôn ở trên đỉnh, bạn sẽ phải tải xuống lại theo cách thủ công và điều đó cũng có nghĩa là bạn sẽ không thể sử dụng nó làm kho lưu trữ git ...

Không chắc chắn nếu đó là những gì bạn đang tìm kiếm trong trường hợp này (một lần nữa, "tải xuống" / xem so với "bản sao" / phát triển), nhưng dù sao nó cũng có thể hữu ích ...


9
Nếu bạn không thấy liên kết tải xuống, hãy đảm bảo rằng bạn đang ở trang repo chính (không phải thư mục con.) Có vẻ như bạn chỉ có thể tải xuống một zip của toàn bộ repo. Ngoài ra, trang trợ giúp github này có thể hữu ích.
JD Smith

2
Dễ dàng truy cập điểm và nhấp. Dễ dàng để có được một bản phát hành trước. Dễ dàng kéo thư mục mong muốn ra khỏi zip đã tải xuống. Cảm ơn bạn.
Andy Thomas

1
URL chung để tải xuống từ tar.gz:https://github.com/${owner}/${repo}/archive/${hash}.tar.gz
Krisztian

11

Tóm tắt năm 2019

Có nhiều cách khác nhau để xử lý việc này, tùy thuộc vào việc bạn muốn làm điều này bằng tay hay lập trình.

Có bốn lựa chọn được tóm tắt dưới đây. Và đối với những người thích giải thích thực tế hơn, tôi đã tổng hợp một video YouTube: Tải xuống các tệp và thư mục riêng lẻ từ GitHub .

Ngoài ra, tôi đã đăng một câu trả lời tương tự trên StackOverflow cho những ai cần tải xuống các tệp đơn từ GitHub (trái ngược với các thư mục).


1. Giao diện người dùng GitHub

  • Có một nút tải xuống trên trang chủ của kho lưu trữ. Tất nhiên, điều này tải xuống toàn bộ repo, sau đó bạn sẽ cần giải nén tải xuống và sau đó kéo ra thư mục cụ thể mà bạn cần.

2. Công cụ của bên thứ ba

  • Có rất nhiều tiện ích mở rộng trình duyệt và ứng dụng web có thể xử lý việc này, với DownGit là một trong số đó. Chỉ cần dán URL GitHub vào thư mục (ví dụ https://github.com/babel/babel-eslint/tree/master/lib) và nhấn nút "Tải xuống".

3. lật đổ

  • GitHub không hỗ trợ git-archive (tính năng git cho phép chúng tôi tải xuống các thư mục cụ thể). Tuy nhiên, GitHub hỗ trợ nhiều tính năng Subversion, một trong số đó chúng ta có thể sử dụng cho mục đích này. Subversion là một hệ thống kiểm soát phiên bản (thay thế cho git). Bạn sẽ cần Subversion cài đặt. Lấy URL GitHub cho thư mục bạn muốn tải xuống. Bạn sẽ cần phải sửa đổi URL này, mặc dù. Bạn muốn liên kết đến kho lưu trữ, theo sau là từ "thân cây" và kết thúc bằng đường dẫn đến thư mục lồng nhau. Nói cách khác, sử dụng cùng một ví dụ liên kết thư mục mà tôi đã đề cập ở trên, chúng tôi sẽ thay thế "cây / chủ" bằng "thân cây". Cuối cùng, mở một thiết bị đầu cuối, điều hướng đến thư mục mà bạn muốn tải xuống nội dung, nhập lệnh sau (thay thế URL bằng URL bạn đã tạo):svn export https://github.com/babel/babel-eslint/trunk/libvà nhấn enter.

4. API GitHub

  • Đây là giải pháp bạn sẽ cần nếu bạn muốn hoàn thành nhiệm vụ này theo chương trình. Và đây thực sự là những gì DownGit đang sử dụng dưới mui xe. Sử dụng API REST của GitHub , viết một tập lệnh thực hiện yêu cầu GET đến điểm cuối nội dung. Điểm cuối có thể được xây dựng như sau : https://api.github.com/repos/:owner/:repo/contents/:path. Sau khi thay thế chỗ dành sẵn, một điểm cuối ví dụ là:https://api.github.com/repos/babel/babel-eslint/contents/lib . Điều này cung cấp cho bạn dữ liệu JSON cho tất cả nội dung tồn tại trong thư mục đó. Dữ liệu có mọi thứ bạn cần, bao gồm nội dung là thư mục hay tệp, URL tải xuống nếu là tệp và điểm cuối API nếu đó là thư mục (để bạn có thể lấy dữ liệu cho thư mục đó). Sử dụng dữ liệu này, tập lệnh có thể đệ quy đi qua tất cả nội dung trong thư mục đích, tạo thư mục cho các thư mục lồng nhau và tải xuống tất cả các tệp cho mỗi thư mục. Kiểm tra mã của DownGit để tìm cảm hứng.

9

Một ví dụ cụ thể khác:

Giống như tôi muốn tải xuống thư mục 'iOS Pro Geo' từ url

https://github.com/alokc83/APRESS-Books-Source-Code-/ cây / chủ /% 20Pro% 20iOS% 20Geo

và tôi có thể làm như vậy thông qua

svn checkout https://github.com/alokc83/APRESS-Books-Source-Code-/trunk/%20Pro%20iOS%20Geo

Lưu ý thân cây trong đường dẫn

Đã chỉnh sửa: (theo nhận xét của Tommie C)

Có, sử dụng xuất thay vì thanh toán sẽ cung cấp một bản sao sạch mà không cần thêm tệp lưu trữ git.

svn export https://github.com/alokc83/APRESS-Books-Source-Code-/trunk/%20Pro%20iOS%20Geo

Đã chỉnh sửa: Nếu cây / chủ không có trong url thì Fork nó và nó sẽ ở đó trong url Forked.


2
Chỉ cần thay đổi thanh toán để xuất nếu bạn chỉ muốn tải xuống một bản sao của thư mục chứ không phải thanh toán.
Tommie C.

Cảm ơn bạn đã trả lời của bạn, chúng ta có thể lặn một chi nhánh? giả sử tôi muốn tải xuống thư mục aaa của
nhánh1

7

Có một gói pip Python3 được gọi là githubdlcó thể làm điều này *:

export GIT_TOKEN=1234567890123456789012345678901234567890123
pip install githubdl
githubdl -u http://github.com/foobar/test -d foo

Trang dự án ở đây

* Khước từ trách nhiệm: Tôi đã viết gói này.


6

Đó là một trong số ít nơi SVN tốt hơn Git.

Cuối cùng, chúng tôi đã hướng tới ba lựa chọn:

  1. Sử dụng wget để lấy dữ liệu từ GitHub (sử dụng chế độ xem tệp thô).
  2. Có các dự án ngược dòng xuất bản tập hợp dữ liệu cần thiết như các tạo phẩm xây dựng.
  3. Từ bỏ và sử dụng kiểm tra đầy đủ. Đó là một thành công lớn trong bản dựng đầu tiên, nhưng trừ khi bạn nhận được nhiều lưu lượng truy cập, nó không quá rắc rối trong các bản dựng sau.

4
Chà, ít Git vs Subversion hơn và nhiều hơn nữa là GitHub căn hộ không cho phép lưu trữ git. (Tôi muốn biết tại sao.)
Rob Howard

6

Nếu bạn cảm thấy thoải mái với các lệnh unix, bạn không cần phụ thuộc đặc biệt hoặc ứng dụng web cho việc này. Bạn có thể tải xuống repo dưới dạng tarball và chỉ gỡ bỏ những gì bạn cần.

Ví dụ (tệp woff2 từ thư mục con trong fontawgie):

curl -L https://api.github.com/repos/FortAwesome/Font-Awesome/tarball | tar xz --wildcards "*/web-fonts-with-css/webfonts/*.woff2" --strip-components=3
  • Tìm hiểu thêm về định dạng liên kết: https://developer.github.com/v3/repose/contents/#get-archive-link (bao gồm cách lấy tệp zip hoặc chi nhánh / refs cụ thể)
  • Giữ phần ban đầu của đường dẫn ( */) để khớp với bất kỳ thư mục nào. Github tạo một thư mục trình bao bọc với tên ref trong tên, vì vậy không thể biết được.
  • Bạn có thể muốn --strip-componentsgiống như số lượng dấu gạch chéo ( /) trong đường dẫn (đối số trước đó).

Điều này sẽ tải về toàn bộ tarball. Sử dụng phương pháp SVN được đề cập trong các câu trả lời khác nếu điều này phải tránh hoặc nếu bạn muốn tốt đẹp với các máy chủ GitHub.


5

Bạn có thể thực hiện tải xuống đơn giản cây thư mục:

git archive --remote git@github.com:foobar/Test.git HEAD:foo | tar xf -

Nhưng nếu bạn có ý định kiểm tra nó và có thể thực hiện các cam kết và đẩy chúng trở lại, thì bạn không thể làm điều đó.


1
Lệnh không hợp lệ: 'git-upload-archive' foobar / Test.git '' Bạn dường như đang sử dụng ssh để sao chép một git: // URL. Đảm bảo tùy chọn cấu hình core.gitProxy của bạn và biến môi trường GIT_PROXY_COMMAND KHÔNG được đặt. gây tử vong: Sự kết thúc từ xa treo lên bất ngờ tar: Điều này không giống như một kho lưu trữ tar tar: Thoát khỏi với tình trạng thất bại do lỗi trước
g_inherit

@g_inherit Tôi có thể tái tạo vấn đề này. Mặc dù đây có thể là hướng đi đúng, nhưng câu trả lời này không hợp lệ.
Uli Köhler

mặc dù có rất nhiều phiếu bầu, đây là lời khuyên duy nhất có hiệu quả với tôi.
bhaskarc

5

Chỉ cần khuếch đại các câu trả lời ở trên, một ví dụ thực tế từ kho lưu trữ GitHub thực đến thư mục cục bộ sẽ là:

svn ls https://github.com/rdcarp/playing-cards/trunk/PumpkinSoup.PlayingCards.Interfaces

svn export https://github.com/rdcarp/playing-cards/trunk/PumpkinSoup.PlayingCards.Interfaces  /temp/SvnExport/Washburn

Đôi khi một ví dụ cụ thể giúp làm rõ các thay thế được đề xuất.


5

Không có câu trả lời nào giúp ích trong tình huống của tôi. Nếu bạn đang phát triển cho Windows, bạn có thể không có svn. Trong nhiều trường hợp, người ta không thể tin tưởng vào người dùng đã cài đặt Git hoặc không muốn tải xuống toàn bộ kho lưu trữ vì những lý do khác. Một số người trả lời câu hỏi này, như Willem van Ketwich và aztack, đã tạo ra các công cụ để hoàn thành nhiệm vụ này. Tuy nhiên, nếu công cụ không được viết cho ngôn ngữ bạn đang sử dụng hoặc bạn không muốn cài đặt thư viện của bên thứ ba, những công cụ này sẽ không hoạt động.

Tuy nhiên, có một cách dễ dàng hơn nhiều. GitHub có API cho phép bạn tải xuống một tệp hoặc toàn bộ nội dung của thư mục bằng các yêu cầu GET . Bạn có thể truy cập một thư mục bằng cách https://api.github.com/repos/:owner/:repo_name/contents/:pathtrả về một đối tượng JSON liệt kê tất cả các tệp trong thư mục. Bao gồm trong bảng liệt kê là một liên kết đến nội dung thô của tệp, download_urltham số. Các tập tin sau đó có thể được tải xuống bằng URL đó.

Đây là một quá trình gồm hai bước đòi hỏi khả năng thực hiện các yêu cầu GET, nhưng điều này có thể được thực hiện bằng hầu hết mọi ngôn ngữ, trên bất kỳ nền tảng nào. Nó có thể được sử dụng để có được các tập tin hoặc thư mục.



4

Tôi sử dụng linux vì vậy, đặt cái này vào ~ / .bashrc, được gọi là chẵn: D $ HOME / .bashrc

git-dowloadfolder(){
a="$1"
svn checkout ${a/tree\/master/trunk}

}

sau đó làm mới vỏ với

source ~/.bashrc 

sau đó sử dụng nó với git-downloadfolder blablabla: D


3

Tôi làm việc với các máy chủ CentOS 7 mà tôi không có quyền truy cập root, cũng không phải git, svn, v.v. (cũng không muốn!) Vì vậy đã tạo một tập lệnh python để tải xuống bất kỳ thư mục github nào: https://github.com/andrrrl/github -folder-downloader

Cách sử dụng rất đơn giản, chỉ cần sao chép phần có liên quan từ dự án github, giả sử dự án là https://github.com/MaxCDN/php-maxcdn/ và bạn muốn có một thư mục chỉ chứa một số tệp nguồn, sau đó bạn cần phải làm một cái gì đó như:

$ python gdownload.py "/MaxCDN/php-maxcdn/tree/master/src" /my/target/dir/
(sẽ tạo thư mục đích nếu không tồn tại)

Nó yêu cầu thư viện lxml , có thể được cài đặt với easy_install lxml
Nếu bạn không có quyền truy cập root (như tôi), bạn có thể tạo một .pydistutils.pytệp vào $HOMEthư mục của mình với các nội dung sau: [install] user=1 easy_install lxmlsẽ chỉ hoạt động (ref: https://stackoverflow.com/a/ 33464597/591257 ).


3

Chỉ cần 5 bước để đi

1) Tải về SVN từ đây .
2) Mở CMD và vào thư mục bin SVN như bên dưới:

cd %ProgramFiles%\SlikSvn\bin

3) Giả sử tôi muốn tải xuống thư mục này URL 4) Bây giờ thay thế bằng 5) Bây giờ kích hoạt lệnh cuối cùng này để tải xuống thư mục trong cùng thư mục.
https://github.com/ZeBobo5/Vlc.DotNet/tree/develop/src/Samples

tree/develop
or
tree/master
trunk

svn export https://github.com/ZeBobo5/Vlc.DotNet/trunk/src/Samples


Điều này dường như không hoạt động cho các repos tư nhân
Sundeep Pidugu

Vâng, nó sẽ không hoạt động đối với các chế độ riêng tư, GIT được khuyến nghị tải xuống các chế độ riêng tư.
Muhammad Ali

2

Để xuất thư mục từ GitHub, thay thế "/ cây / chủ /" trong url của thư mục bằng "/ trunk /".

Ví dụ: để xuất thư mục từ URL sau:

https://github.com/liferay/liferay-plugins/tree/master/portlets/sample-hibernate-portlet

chạy lệnh sau:

svn export https://github.com/liferay/liferay-plugins/trunk/portlets/sample-hibernate-portlet

2

Một câu trả lời đơn giản cho vấn đề này là đầu tiên svn rùa từ liên kết sau.

https://tortoisesvn.net/doads.html

trong khi cài đặt bật tùy chọn CLI, để nó có thể được sử dụng từ giao diện dòng lệnh.

sao chép liên kết thư mục phụ git hub.

Thí dụ

https://github.com/tensorflow/models/tree/master/research/deeplab

thay cây / chủ bằng thân cây

https://github.com/tensorflow/models/trunk/research/deeplab

và làm

thanh toán svn https://github.com/tensorflow/models/trunk/research/deeplab

các tập tin sẽ được tải xuống thư mục deeplab trong thư mục hiện tại.


2

bạn có thể sử dụng git svn theo cách sau.

git svn clone https://github.com/lodash/lodash/trunk/test

Bằng cách này, bạn không phải trải qua nỗi đau khi thiết lập svn, đặc biệt dành cho người dùng Windows.


Cảm ơn bạn. Tôi có thể xác nhận rằng nó hoạt động cho Windows. Không hoạt động trên gcloud mặc dù. Nó nói git: 'svn' không phải là một lệnh
JOSEPH Blessingh

sudo apt install git-svnlà bắt buộc khi chạy qua WSL.
Jammy Dodger

1

Nếu bạn cần thực hiện theo chương trình và bạn không muốn dựa vào SVN, bạn có thể sử dụng API GitHub để tải xuống tất cả các nội dung theo cách đệ quy.

Để lấy cảm hứng, đây là ý chính của ruby ​​của tôi: https://gist.github.com/cvengros/b2a7e82f66519d423b6f


1

Sử dụng chức năng này, đối số đầu tiên là url đến thư mục, thứ hai là nơi thư mục sẽ được tải xuống:

function github-dir() {
    svn export "$(sed 's/tree\/master/trunk/' <<< "$1")" "$2"  
}

1

git clone --filter từ Git 2.19

Tùy chọn này thực sự sẽ bỏ qua việc tìm nạp các đối tượng không cần thiết từ máy chủ:

git clone --depth 1 --no-checkout --filter=blob:none \
  "file://$(pwd)/server_repo" local_repo
cd local_repo
git checkout master -- mydir/

Máy chủ nên được cấu hình với:

git config --local uploadpack.allowfilter 1
git config --local uploadpack.allowanysha1inwant 1

Một phần mở rộng đã được tạo cho giao thức từ xa Git để hỗ trợ tính năng này trong v2.19.0, nhưng không có hỗ trợ máy chủ tại thời điểm đó. Nhưng nó đã có thể được thử nghiệm tại địa phương.

Tôi đã trình bày chi tiết hơn tại: Làm cách nào để sao chép thư mục con chỉ của kho Git?


1
Thú vị và nâng cao. Tôi cho rằng tôi phải đề cập đến tính năng 2.19 này ở nơi khác.
VonC

@VonC Tôi nghĩ rằng tôi đã đánh bại bạn một lần rồi: stackoverflow.com/questions/2466735/ và tôi chỉ nhìn vào nó sau khi phát hành XD! Tất nhiên tôi đã Googling ngày hôm nay một chút sau khi phát hành 2.22, tất cả câu trả lời đã được cập nhật tất nhiên ;-) Nó không bao giờ làm tôi buồn vì làm thế nào luôn luôn có một bản sao khác, và cuối cùng tôi tìm thấy nó một năm sau đó một truy vấn hơi khác nhau. Mặc dù vậy, tôi không có ý định đánh bại bạn trên git, quá khó, nhưng hãy chú ý đến số lượng necromancer! haha
Ciro Santilli 冠状 病毒 审查 六四 事件

Chà, hãy tiếp tục làm tốt công việc: tất cả cộng đồng sẽ được hưởng lợi từ cuộc thi phụ này (và tôi đã đưa ra câu trả lời khác của bạn vào lúc đó)
VonC

@VonC đùa tất nhiên, tôi cũng upvote công cụ của bạn. Tôi chỉ cần tìm cách đổi số điểm đó thành tiền ngay bây giờ XD
Ciro Santilli 冠状 病毒 审查 六四 事件

1

Vì bất kỳ lý do gì, svngiải pháp không hiệu quả với tôi và vì tôi không cần svnbất cứ điều gì khác, nên việc dành thời gian để thử nó là vô nghĩa, vì vậy tôi đã tìm một giải pháp đơn giản bằng các công cụ tôi đã có. Tập lệnh này chỉ sử dụng curlawkđể tải xuống tất cả các tệp trong thư mục GitHub được mô tả là "/:user:repo/contents/:path".

Phần thân được trả về của một lệnh gọi đến "GET /repos/:user:repo/contents/:path"lệnh API GitHub REST trả về một đối tượng bao gồm một "download_url"liên kết cho mỗi tệp trong một thư mục.

Tập lệnh dòng lệnh này gọi API REST sử dụng curlvà gửi kết quả thông qua AWK, bộ lọc này trừ tất cả các dòng "download_url", xóa dấu ngoặc kép và dấu phẩy khỏi các liên kết, sau đó tải xuống các liên kết bằng cách sử dụng lệnh gọi khác để cuộn tròn.

curl -s https://api.github.com/repos/:user/:repo/contents/:path | awk \
     '/download_url/ { gsub("\"|,", "", $2); system("curl -O "$2"); }'

1

git sparse-checkout

Git 2.25.0 bao gồm một git sparse-checkoutlệnh thử nghiệm mới giúp cho tính năng hiện có dễ sử dụng hơn, cùng với một số lợi ích hiệu suất quan trọng cho các kho lưu trữ lớn. ( Blog GitHub )

Ví dụ với phiên bản hiện tại :

git clone --filter=blob:none --sparse https://github.com/git/git.git
cd git
git sparse-checkout init --cone
git sparse-checkout add t

Đáng chú ý nhất

  • --sparsechỉ kiểm tra các tệp thư mục cấp cao nhất của gitkho lưu trữ vào bản sao làm việc
  • git sparse-checkout add ttăng dần / kiểm tra tthư mục con củagit

Các yếu tố khác

  • git sparse-checkout init thực hiện một số chuẩn bị để cho phép kiểm tra một phần
  • --filter=blob:nonetối ưu hóa tìm nạp dữ liệu bằng cách chỉ tải xuống các đối tượng git cần thiết (hãy xem tính năng sao chép một phần để biết thêm thông tin)
  • --cone cũng tăng tốc hiệu suất bằng cách áp dụng các mẫu bao gồm tệp bị hạn chế hơn

Trạng thái GitHub

GitHub vẫn đang đánh giá tính năng này trong nội bộ trong khi nó được bật trên một vài kho lưu trữ được chọn [...]. Khi tính năng ổn định và đáo hạn, chúng tôi sẽ cập nhật cho bạn về tiến trình của nó. ( tài liệu )


Nâng cao. Tôi đã trình bày lệnh đó trong stackoverflow.com/a/59515426/6309 , với bộ mẫu nhân bản.
VonC
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.