2012-01-19 15 views
17

Chcę sklonować repozytorium jądra Linux, ale tylko od wersji 3.0, ponieważ repozytorium jądra jest tak wielkie, że moje narzędzia do obsługi wersji działają szybciej, jeśli mogę zrobić płytki klon. Rdzeń mojego pytania brzmi: jak mogę powiedzieć git, jaka jest wartość "n" dla parametru --depth? Miałam nadzieję, że to będzie działać:git płytkie klon do określonego tagu

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

dzięki.

+0

Zobacz także [Jak usunąć starą historię z repozytorium git?] (Http://stackoverflow.com/questions/4515580/how-do-i-remove-the-old-history-froma-a- git-repository) – Alberto

Odpowiedz

2

Niestety parametr --depth z git clone akceptuje tylko liczbę, liczbę wersji, na którą należy skasować repozytorium klonowania.

Możliwe rozwiązanie polega na sklonowaniu całego repozytorium, a następnie skróceniu jego historii, aby zachować tylko zatwierdzenia po wersji 3.0. Oto dobry sposób, aby: 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

To powinno działać tak dobrze, jak podane przeze mnie rozwiązanie, ale sugerowałbym usunięcie wszystkich innych lokalnych referencji i wykonanie kroków czyszczenia, które mam w swoim rozwiązaniu. Bez tego repo będzie nadal zawierać całą historię i dodatkowe obiekty. Dzięki temu repozytorium jest około 2 milionów obiektów wiszących w pobliżu, niż potrzeba. – James

+0

Dobra uwaga, dodano – tomgi

+0

Ta strategia wymaga zarządzania sprzecznymi połączeniami i wiąże się z ryzykiem utworzenia niepoprawnej kopii ostatecznego wzorca w zależności od sposobu obsługi połączeń. Ponieważ repozytorium jest tak duże, jest bardzo mało prawdopodobne, aby można było scalić ręcznie, aby dodać opcję '-Xours' lub' -Xtheirs' do polecenia rebase. Jestem pewien, że ostateczny wynik różni się od źródła głównego ref. – James

7

Czytaj pełnego rozwiązania, ale niestety, git clone nie działa w sposób, o którą wnioskujesz. Parametr --depth ogranicza liczbę revisions, a nie liczbę commits. Nie ma parametru klonowania, który ogranicza liczbę zatwierdzeń. W twojej sytuacji, nawet gdybyś wiedział, że istnieje tylko co najwyżej 10 różnic w porównaniu z plikiem, który zmienił się najbardziej pomiędzy wersją 3.0 a najnowszą wersją HEAD w repozytorium i użyłeś --depth 10, możesz uzyskać większość lub całą historię repozytorium. Ponieważ niektóre obiekty mogą nie mieć aż 10 poprawek, a ich historia zostanie przeniesiona z powrotem na początek ich pierwszego pojawienia się w repozytorium.

Oto, jak wykonać to, co lubisz: Kluczem do problemu jest to, że potrzebujesz zatwierdzeń między wersją 3.0 a najnowszą najbardziej potrzebną referencją. Oto kroki zrobiłem właśnie do tego:

  • git clone http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --depth 10075 smaller_kernel_repo
  • cd smaller_kerenel_repo
  • Ustal sha z v3.0 git log --oneline v3.0^..v3.0
  • utworzyć punkt szczepiony wychodząc z tego sztuczny (to 02f8c6aee8df3cdc935e9bdd4f2d020306035dbe)
  • echo "02f8c6aee8df3cdc935e9bdd4f2d020306035dbe" > .git/info/grafts
  • Aby obejść niektóre problemy z niektórymi wpisami w dzienniku jądra, wykonaj następujące czynności: export GIT_AUTHOR_NAME="tmp" i export GIT_COMMITTER_NAME="tmp"

  • Jest miły ostrzeżenie o w manualu o git filter-branch przepisywania historii przez następujące punkty szczepione ... więc pozwala nadużyciom, że teraz uruchomić git filter-branch i usiąść i czekać ... (i czekać i czekać)

teraz trzeba posprzątać wszystko:

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

Ten proces jest czasochłonny, ale nie bardzo skomplikowane. Mam nadzieję, że zaoszczędzi ci to czasu, na który miałeś nadzieję w dłuższej perspektywie. W tym momencie będziesz miał repozytorium ze zmienioną historią tylko wersji 3.0 z repozytorium linux-stable.git.Podobnie jak w przypadku użycia na klonie wersji --depth, masz takie same restrykcje na repozytorium i będziesz mógł modyfikować i wysyłać poprawki z historii, którą już posiadasz. Istnieją sposoby obejścia tego .. ale to zasługuje na własne Q & A.

Jestem w trakcie testowania ostatnich kilku kroków samodzielnie, ale operacja git filter-branch nadal trwa. Zaktualizuję ten post w przypadku jakichkolwiek problemów, ale zacznę go publikować, aby można było rozpocząć ten proces, jeśli uznasz to za dopuszczalne.

UPDATE

Obejście dla wydania (śmiertelnym: pusty ozn <> nie jest to dozwolone). Ten problem wynika z problemu z historią zatwierdzania repo systemu Linux.

Zmień komendę git filter-branch do:

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

Myślę, że to zbyt skomplikowane rzeczy, aby ściśle rozróżnić między * rewizją * i * popełnianiem * tutaj. Chociaż jestem świadomy [formalnej różnicy] (http://stackoverflow.com/a/11792712/1127485), w kontekście 'git clone --depth ' liczba wersji równa się liczbie commitów z wskazówki. – sschuberth

0

Parametr --depth wydaje się być tylko numer ("Oznaczony numer korekt"), a nie znacznik.

Możliwa pomysł (być testowane):

Można użyć git describe chociaż w celu uzyskania najnowszej tag od ciebie obecny szef, jak również liczbę popełnić pomiędzy wspomnianymi tag i HEAD.
Jeśli ten "najnowszy tag" nie jest twoim tagiem, po prostu powtórz ten proces, zaczynając od commit, do którego odnosi się ten ostatni tag, aż do znalezienia twojego tagu (na przykład v3.0 w twoim przypadku).

Suma wszystkich tych numerów zatwierdzeń daje głębokość, aby nadać komendzie git clone, pod warunkiem, że tag jest dostępny z bieżącego HEAD.

17

Co powiesz na klonowanie tagu na głębokość 1?

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

Jak to jest ** NIE ** zaakceptowana odpowiedź? – tftd

1

Dla kogoś, kto ma już klona ta komenda otrzyma liczbę zatwierdzeń między końcówką bieżącym oddział i znacznika 5.6:

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

znalazłem ten projekt wykonawczy Aktualizacja listy przy użyciu interfejsu API GitHub: https://github.com/cjlarose/github-rev-list

Bardzo długa strona podręcznika na stronie rev-list wskazuje, że wiele dzieje się za kulisami. Istnieje wiele różnych ścieżek, w których możliwe jest liczenie zobowiązań z gałęziami i połączeniami przychodzącymi i odchodzącymi. (?) W tym przypadku użycia jednak, że można prawdopodobnie ignorowane

0

Aby @ n8henrie odpowiedzieć nieco pełniejsze, można dodać opcję --single-branch, tak:

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

W tym było można dostać tylko obiekty repozytorium związane z tym konkretnym tagiem, które z mojego doświadczenia, w wielu przypadkach, oszczędzają sporo miejsca.Od git-clone docs:

- [NIE] pojedynczej gałęzi

Clone tylko historia prowadzi do końcówki jeden oddział, albo podane przez opcję --branch lub jego podstawowego branży remote HEAD punktów w. Dalsze pobieranie do wynikowego repozytorium spowoduje jedynie aktualizację gałęzi śledzenia zdalnego dla gałęzi, z której ta opcja została użyta do początkowego klonowania. Jeśli numer HEAD na pilocie nie wskazywał żadnej gałęzi po utworzeniu klonu --single-branch, nie utworzono gałęzi śledzenia zdalnego.

Dodatkowa uwaga: jeśli klonowanie lokalnego repo z innego folderu w tym samym komputerze, to należy odnieść się do niej za pomocą protokołu file://, zamiast określania tylko nazwę folderu.

Powiązane problemy