Mam firmowe konto GitHub i chcę wykonać kopię zapasową wszystkich repozytoriów w ramach, biorąc pod uwagę wszystko, co może zostać utworzone na potrzeby automatyzacji. Miałem nadzieję, że coś takiego:
git clone [email protected]:company/*.git
lub coś podobnego zadziałałoby, ale nie wygląda na to, aby ten symbol wieloznaczny był tam podobny.
Czy w Git jest sposób na sklonowanie, a następnie pobranie wszystkiego, zakładając, że ma się odpowiednie uprawnienia?
Odpowiedzi:
Myślę, że nie można tego zrobić w ten sposób. Najlepszym rozwiązaniem jest znalezienie i przejrzenie listy repozytoriów organizacji za pomocą interfejsu API.
Spróbuj tego:
http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
ssh_url
nieruchomości.git clone
każdy z tychssh_url
s.To trochę dodatkowej pracy, ale GitHub musi mieć odpowiednie uwierzytelnianie.
źródło
curl -i https://github.com/api/v3/orgs/company/repos?access_token=<token>
https://github.com/api/v3/
spróbujhttps://api.github.com/
./users/${COMPANY}/repos
ścieżki/orgs/${COMPANY}/repos
.access_token
parametru zapytania jest przestarzałe. Jeśli ten token jest używany przez aplikację, nad którą nie masz kontroli, pamiętaj, że może przestać działać w wyniku tego wycofania.W systemie Windows i wszystkich systemach UNIX / LINUX , używając Git Bash lub innego terminala , zastąp
YOURUSERNAME
swoją nazwą użytkownika i użyj:CNTX=users
iNAME=yourusername
, aby pobrać wszystkie swoje repozytoria.CNTX=orgs
iNAME=yourorgname
, aby pobrać wszystkie repozytoria organizacji.Maksymalny rozmiar strony to 100, więc musisz zadzwonić do tego kilka razy z odpowiednim numerem strony, aby uzyskać wszystkie swoje repozytoria (ustaw
PAGE
żądany numer strony, którą chcesz pobrać).Oto skrypt powłoki, który wykonuje powyższe czynności: https://gist.github.com/erdincay/4f1d2e092c50e78ae1ffa39d13fa404e
źródło
Repozytoria organizacji
Aby sklonować wszystkie repozytoria z organizacji, wypróbuj następującą jednoliniową powłokę:
Repozytoria użytkowników
Klonowanie wszystkiego za pomocą adresów URL repozytorium Git:
Klonowanie wszystkiego za pomocą Clone URL:
Oto przydatna funkcja powłoki, którą można dodać do plików startowych użytkownika (za pomocą
curl
+jq
):Prywatne repozytoria
Jeśli chcesz sklonować prywatne repozytoria, możesz dodać token autoryzacji w swoim nagłówku, na przykład:
lub przekaż go w param (
?access_token=TOKEN
), na przykład:Uwagi:
type=private
do ciągu zapytania.hub
po skonfigurowaniu klucza API.Zobacz też:
Wskazówki :
- Aby zwiększyć szybkość, ustaw liczbę równoległych procesów, określając
-P
parametr dlaxargs
(-P4
= 4 procesy).- Jeśli chcesz zwiększyć limity GitHub, spróbuj uwierzytelnić się, określając klucz API.
- Dodaj
--recursive
rekursję do zarejestrowanych modułów podrzędnych i zaktualizuj wszystkie zagnieżdżone moduły podrzędne.źródło
Ta treść kończy zadanie w jednej linii w linii poleceń:
Zastąp
[your_org]
nazwą swojej organizacji. I ustaw,per_page
jeśli to konieczne.AKTUALIZACJA:
Jak wspomniał ATutorMe, maksymalny rozmiar strony to 100, zgodnie z dokumentacją GitHub .
Jeśli masz więcej niż 100 repozytoriów, musisz dodać
page
parametr do swojego adresu URL i możesz uruchomić polecenie dla każdej strony.Uwaga:
per_page
parametr domyślny to30
.źródło
Przejdź do Ustawienia konta -> Aplikacja i utwórz klucz API
Następnie wstaw klucz API, adres URL instancji github i nazwę organizacji w poniższym skrypcie
Zapisz to w pliku,
chmod u+x
plik, a następnie uruchom go.Dzięki Arnaud za kod rubinowy.
źródło
Więc dodam też swoją odpowiedź. :) (stwierdziłem, że to proste)
Lista pobierania (użyłem firmy "magento"):
Użyj
clone_url
zamiastssh_url
dostępu użycie HTTP.Więc sklonujmy je wszystkie! :)
Jeśli zamierzasz pobrać repozytorium prywatne - po prostu dodaj parametr GET
?access_token=YOURTOKEN
źródło
Znalazłem komentarz w sedno @seancdavis warunkiem jest bardzo pomocny, zwłaszcza, że jak oryginalny plakat, chciałem, aby zsynchronizować wszystkie repo dla szybkiego dostępu, jednak z których większość były prywatne.
Zastąp [[NAZWA UŻYTKOWNIKA]] swoją nazwą użytkownika github, a [[ORGANIZACJA]] nazwą swojej organizacji Github. Dane wyjściowe (metadane repozytorium JSON) zostaną przekazane do prostego skryptu ruby:
źródło
.../orgs/[[organization]]/repos...
na.../users/[[username]]/repos...
. Teraz mogę szybko zaimportować całą swoją pracę na różne komputery lokalne. DZIĘKI!Zrobiłem skrypt z Python3 i Github APIv3
https://github.com/muhasturk/gitim
Po prostu biegnij
źródło
Ta jedna linijka Pythona zrobi to, czego potrzebujesz. To:
dla każdego, wykonuje wywołanie systemowe
git clone
źródło
źródło
?page=2
.Proste rozwiązanie:
źródło
Aby go użyć (zakładając, że masz zainstalowany nodejs)
Spowoduje to pobranie listy wszystkich repozytoriów z
wires
i zapisanie informacji dotest
katalogu, używając szczegółów autoryzacji (użytkownik / hasło), które podasz w CLI.W szczegółach to
W rzeczywistości nie klonuje repozytoriów, ale zamiast tego zapisuje
.txt
plik, do którego możesz przekazać,xargs
aby wykonać klonowanie, na przykład:cd /tmp/test cat wires-repo-urls.txt | xargs -n2 git clone # or to pull cat /tmp/test/wires-repo-urls.txt | xargs -n2 git pull
Może jest to dla ciebie przydatne; to tylko kilka linijek JS, więc powinno być łatwe do dostosowania do twoich potrzeb
źródło
Do tego celu służy również bardzo przydatny moduł npm . Może nie tylko klonować, ale także ściągać (aby zaktualizować dane, które już masz).
Po prostu tworzysz konfigurację w ten sposób:
i
gitall clone
na przykład. Lubgitall pull
źródło
Jeśli ktoś szuka rozwiązania dla systemu Windows, oto mała funkcja w PowerShell, aby załatwić sprawę (może to być oneliner / alias, jeśli nie fakt, że potrzebuję go do pracy zarówno z proxy, jak i bez).
źródło
Tak więc, w praktyce, jeśli chcesz sklonować wszystkie repozytoria z organizacji,
FOO
która pasujeBAR
, możesz użyć poniższego linijki poniżej, która wymaga narzędzi jq i typowych narzędzi CLIźródło
Kolejny skrypt powłoki z komentarzami, który klonuje wszystkie repozytoria (publiczne i prywatne) od użytkownika:
źródło
Utwórz alias / func bash w swoim
~/.bashrc file
Rozwiązałem to dla mojego zespołu, tworząc alias / bash func w moim
~/.bashrc file
kroki
otwórz terminal lub powłokę Linuksa i otwórz
~/.bashrc file
:dodaj tę funkcję:
CloneAll() { # Make the url to the input github organization's repository page. ORG_URL="https://api.github.com/orgs/${1}/repos?per_page=200"; # List of all repositories of that organization (seperated by newline-eol). ALL_REPOS=$(curl -s ${ORG_URL} | grep html_url | awk 'NR%2 == 0' \ | cut -d ':' -f 2-3 | tr -d '",'); # Clone all the repositories. for ORG_REPO in ${ALL_REPOS}; do git clone ${ORG_REPO}.git; done }
zapisz i zamknij plik ~ / .bashrc, a następnie zamknij terminal - musisz to zrobić, inaczej nowa funkcja nie zostanie zainicjalizowana:
otwórz nowy terminal i wypróbuj go:
Przykład : jeśli Twój osobisty adres URL repozytorium github nazywa się https://github.com/awesome-async, polecenie byłoby takie
Ważny
per_page=200
pod koniec pierwszej zmiennejORG_URL
ustawia liczbę transakcji repo, które zostaną sklonowane, więc zwrócić szczególną uwagę, że:ORG_URL="https://api.github.com/orgs/${1}/repos?per_page=200"; <---- make sure this is what you want
Mam nadzieję że to pomoże! :)
źródło
...repos?page=${2}&per_page=100";
Możesz uzyskać listę repozytoriów, używając,
curl
a następnie iterując po tej liście za pomocą pętli bash:źródło
Możesz użyć narzędzia open source, aby sklonować kilka repozytoriów github: https://github.com/artiomn/git_cloner
Przykład:
git_cloner --type github --owner octocat --login user --password user https://my_bitbucket
Użyj JSON API z
api.github.com
. Możesz zobaczyć przykład kodu w dokumentacji github: https://developer.github.com/v3/Albo tam:
https://github.com/artiomn/git_cloner/blob/master/src/git_cloner/github.py
źródło
Aby sklonować tylko prywatne repozytoria, mając klucz dostępu i mając zainstalowany moduł Python 3 i request:
źródło
Rozwiązanie w języku Python3, które obejmuje pełne stronicowanie za pomocą
Link
nagłówka.Wymagania wstępne:
pip3 install links-from-link-header
Następnie możesz użyć
xargs
lub równolegle i:cat repolist | parallel -I% hub clone %
źródło
Jeśli masz listę repozytoriów na liście takiej jak ta, to działa ten skrypt powłoki:
źródło
Stworzyłem przykładowy skrypt wsadowy. Możesz pobrać wszystkie repozytoria prywatne / publiczne ze strony github.com. Po pobraniu repozytorium jest ono automatycznie konwertowane na plik zip.
Uwaga: plik files.txt powinien zawierać tylko nazwy repozytoriów, takie jak:
źródło
Aktualizacja z 19 maja
użyj tego polecenia bash dla organizacji (w tym prywatne repozytorium)
źródło
Przeważające tutaj odpowiedzi nie uwzględniają tego, że Github API zwróci maksymalnie 100 repozytoriów, niezależnie od tego, co możesz określić w
per_page
. Jeśli klonujesz organizację Github z ponad 100 repozytoriami, będziesz musiał skorzystać z linków stronicowania w odpowiedzi API.Napisałem narzędzie CLI, aby to zrobić :
Spowoduje to sklonowanie wszystkich repozytoriów w
myorg
organizacji do bieżącego katalogu roboczego.źródło
W przypadku organizacji, do których masz dostęp za pomocą prywatnych repozytoriów:
Używa
html_url
, więcaccess_token
po wyświetleniu monitu nie musisz po prostu wpisywać hasła github.źródło
Sklonuj wszystkie swoje repozytoria, które nie są forkami:
curl -u "username" https://api.github.com/user/repos\?page\=1\&per_page\=100 | jq -r 'map(select(.fork == false)) | .[] | .ssh_url' | xargs -L1 git clone
Sklonuj swoje istoty:
curl https://api.github.com/users/username/gists\?page\=1\&per_page\=100 | jq -r ".[] | .git_pull_url +\" '\" + (.files|keys|join(\"__\") + \"'\")" | xargs -L1 git clone
To
jq
polecenie jest złożone, ponieważ nazwa repozytorium streszczeń jest skrótami, więc polecenie łączy wszystkie nazwy plików, aby były nazwą repozytoriumMożesz dowolnie filtrować JSON, używając
jq
zainstalować:
sudo apt-get install jq
W powyższym przykładzie odfiltrowałem forki, używając tego:
curl ... | jq -r 'map(select(.fork == false))' ...
- przydatne, gdy nie klonujesz repozytoriów, gdy wykonałeś przypadkowe żądania ściągnięciajq obsługuje bardzo zaawansowane funkcje.
man jq
jest twoim przyjacielemMożesz uwierzytelnić się,
curl -u "username" ...
aby uzyskać dostęp do prywatnych repozytoriówURL-e API Guthuba
https://api.github.com/user/repos\?page\=1\&per_page\=100
https://api.github.com/users/other_username/repos\?page\=1\&per_page\=100
https://api.github.com/orgs/orgname/repos\?page\=1\&per_page\=100
Dokumenty API Github dla repozytoriów
źródło
źródło
Aby sklonować wszystkie swoje prywatne i publiczne repozytoria, po prostu wygeneruj nowy token dostępu z dostępem do repozytoriów i użyj tego:
(zastąp własnym tokenem dostępu i nazwą użytkownika)
Spowoduje to sklonowanie wszystkich repozytoriów w bieżącym folderze
To jest mały program bash, możesz go po prostu wkleić do terminala i nacisnąć Enter
źródło
Możesz użyć narzędzia takiego jak GitHub Archive które pozwala klonować / pobierać publiczne i prywatne repozytoria osobiste, repozytoria organizacji i streszczenia za pomocą jednego prostego narzędzia.
Jeśli chodzi o automatyzację, możesz skonfigurować archiwum GitHub, aby działało na przykład raz dziennie lub raz w tygodniu, a pominie te, które są sklonowane i pobierze nowe zmiany od ostatniego uruchomienia wszystkich innych.
Źródło: https://github.com/Justintime50/github-archive
źródło