2017-02-26 18 views
6

robię jakieś zaawansowane wykorzystanie Git, odpytywanie obiektów w celu optymalizacji tras testowych mojego kodu, więc pokrywa się ze mną, jeśli następujących dźwięków bardzo daleko od zużycia, że ​​większość ludzi zrób z Git.Git: obiekty Przeglądaj w odległym

chcę zrobić coś jak git cat-file -p [...], z wyjątkiem obiektów na pilocie, bez ich pobierania. tzn. chcę powiedzieć: "Na zdalnym origin, pokaż mi zatwierdzić A, w szczególności powiedz mi, co jest identyfikatorem jego drzewa, a następnie pokaż mi zawartość drzewa (lista bloków i poddrzew)." Nie muszę pobrać rzeczywistą zawartość plików, tylko powyższe informacje.

Wiem, że mogłem po prostu pobrać zatwierdzenie z pilota do mojego lokalnego repozytorium i użyć na nim git cat-file, ale wtedy będzie to wymagało pobrania wszystkich rodziców zatwierdzenia z pilota, co może zająć dużo czasu. Potrzebuję tego szybko, ponieważ jest wykonywany w programie, który powinien działać setki razy dziennie w wielu różnych repozytoriach.

Czy istnieje sposób, aby zrobić powyżej bez pobierania commit?

Odpowiedz

1

Zakładam, że masz już zweryfikowane że git fetch --depth=... nie robić, co chcesz.

Jeśli masz ssh/scp dostęp do odległych, można po prostu chwycić plik indiviudal za to commit (jeśli popełnić jako hash a1b2c3d4, jest on przechowywany w pliku objects/a1/b2c3d4). Umieść go w lokalnej lokacji .git/objects w tym samym katalogu/nazwie. Następnie, jak zwykle, używaj lokalnego git cat-file. Z jego danych wyjściowych można przeanalizować mieszanie drzewa i przejść do niego, pobierając pojedyncze pliki obiektów, aż do zakończenia. git cat-file nie dba o brakujące bity, jeśli masz skrót, dla którego plik istnieje, z przyjemnością wyświetli jego zawartość.

Aby uniknąć problemów w "prawdziwym" lokalnym repozytorium, można to zrobić w pustych repozytoriach, tj. Utworzonych właśnie za pomocą git init tmprepos lub cokolwiek innego. Nie boli, że nie ma tam nic więcej.

EDYCJA: git przechowuje niektóre obiekty wewnątrz plików pakietu. Aby uzyskać instrukcje, jak się do nich dostać, patrz: https://git-scm.com/book/en/v1/Git-Internals-Transfer-Protocols.

+0

Dzięki, że to może działać, ale to oznacza, że ​​teraz trzeba dodać logikę, która wygląda w adresie URL, widzi czy to ssh, jeśli uzyskuje dostęp do serwera za pomocą SSH biblioteki ... To wielki bałagan. Mam nadzieję, że jest lepsze rozwiązanie. –

+0

Tak, będziesz musiał wykonać to programowanie samemu, nie ma żadnego polecenia o niskim poziomie niż 'git fetch', które możesz polecić, aby pobrać pojedyncze zatwierdzenia. Nie nazwałbym tego bałaganem, tylko programowaniem. Zacznę od 'system (" scp ... ")' lub cokolwiek innego musisz wywoływać komendy systemowe w wybranym języku skryptowym i wybierać tylko bibliotekę SSH, jeśli wydajność jest zła z powodu uruchamiania podprocesowego. Jeśli mają dostęp http, to jest to ta sama odpowiedź, tylko inna protokół. – AnoE