Możesz git checkout-indexdo tego użyć , jest to polecenie niskiego poziomu, jeśli chcesz wyeksportować wszystko, możesz użyć -a,
git checkout-index -a -f --prefix=/destination/path/
Aby zacytować strony podręcznika:
Końcowy znak „/” [na przedrostku] jest ważny. Wyeksportowana nazwa jest dosłownie po prostu poprzedzona określonym ciągiem.
Jeśli chcesz wyeksportować określony katalog, jest kilka sztuczek. Polecenie pobiera tylko pliki, a nie katalogi. Aby zastosować go do katalogów, użyj polecenia „find” i potokuj wyjście do git.
Drobna uwaga - potrzebujesz absolutnej ścieżki, ponieważ nie występuje rozwinięcie tyldy powłoki, tj. --work-tree=/home/thomasg/okcopyRaczej niż --work-tree=~/okcopy(prawdopodobnie użycie ścieżki względnej podczas siedzenia w tym samym drzewie git również działa, ale w ten sposób leży szaleństwo i git statuswyjścia w R'lyehian)
Tom Goodfellow
10
Działa zgodnie z oczekiwaniami również ze starymi zatwierdzeniami (np. Daje SHA zamiast HEAD), jednak git statuswtedy pokazuje wiele modów (prawdopodobnie dlatego, że indeks pasuje teraz do innego katalogu, a nie do nietkniętego normalnego drzewa roboczego). git resetprzywrócił go do dobrego stanu.
Tom Goodfellow
2
To samo tutaj git statuspokazuje wiele modów i git resetnie pomaga. Musiałem git checkout -f HEADprzywrócić stan mojego repozytorium.
DUzun
11
FYI: musisz samodzielnie utworzyć katalog, w przeciwnym razie fatal: This operation must be run in a work tree
pojawi
13
To katastrofalnie zmienia indeks głównego drzewa roboczego, który jest zazwyczaj zły. Jak sugeruje @TomGoodfellow, git resetwystarczy przywrócić główne drzewo robocze do zdrowia. Aby bezpiecznie eksportować podkatalogi repozytorium w dowolnym SHA1, gałęzi lub tagu bez modyfikowania głównego drzewa roboczego, zobacz niesławne rozwiązanie Charlesa Baileya . Podobnie, aby bezpiecznie płacić za wiele oddziałów w tym samym czasie, nowa podkomenda jest Twoim przyjacielem. git archivegit worktree add
+1 i wyjaśnienie „pewnego poprzedniego zatwierdzenia” (zamiast HEAD): Odnosi się do tego, SHA1 IDktóre można łatwo znaleźć poprzez gitk. Gdybym tylko potrzebował "wyewidencjonować" ten plik do tymczasowej lokalizacji (tj. Nie przywracać), showgit show 82e54378856215ef96c5db1ff1160a741b5dcd70:MyProj/proguard/mapping.txt > myproj_mapping.txt
użyłbym podkomendy
22
Jeśli pracujesz w ramach swojej funkcji i nie chcesz wracać do kasy, możesz uruchomić:
Najlepsza odpowiedź - prosta iw przeciwieństwie do git --work-tree=/path/to/outputdir checkout HEAD -- .tego nie robi nic z indeksem, po prostu kopiuje wybraną gałąź do określonej lokalizacji (z dodatkiem pliku .git).
Roger Dueck,
Jak miałbym cofnąć tę zmianę?
Scott P.
@ ScottP.po prostu usuń myrepo_masterkatalog
itsnikolay
1
cofnięcie tego jest podkomendą z drzewa roboczego:git worktree remove ../myrepo_master
Martijn Dashorst
19
Powyższe rozwiązania nie zadziałały, ponieważ musiałem sprawdzić konkretną otagowaną wersję drzewa. Nawiasem cvs exportmówiąc , tak ma być używany. git checkout-indexnie przyjmuje argumentu znacznika, ponieważ pobiera pliki z indeksu. git checkout <tag>zmieniłby indeks niezależnie od drzewa roboczego, więc musiałbym zresetować oryginalne drzewo. Rozwiązaniem, które działało dla mnie, było sklonowanie repozytorium. Udostępniony klon jest dość szybki i nie zajmuje dużo dodatkowej przestrzeni. W .gitrazie potrzeby katalog można usunąć.
git --work-tree=/path/to/outputdir checkout <tag> -- .nie działa dla Ciebie?
warvariuc
1
Nie, to nieprawda. Rzeczywisty plik w oryginalnym katalogu roboczym pozostaje niezmieniony, ale wersja pomostowa zostaje utracona i zastąpiona wersją z tagu. Jest to szczególnie złe, jeśli wersja etapowa zawiera starannie dobrany zestaw zmian do zatwierdzenia. Nie chcę, aby polecenie eksportu dotykało mojego indeksu, kropka.
proski
9
Odpowiedź Adriana brzmiała „fatalna: ta operacja musi być przeprowadzona w drzewie roboczym”. Oto, co zadziałało dla nas.
+1 za komentarze na temat tego, jak posprzątać - wszyscy są szczęśliwi mogąc narobić bałaganu w obecnym repozytorium. tylko ten nie ma skutków ubocznych.
Andrew Hill
1
Używam tego aliasu do wyewidencjonowywania gałęzi w katalogu tymczasowym:
Następnie zostaniesz przeniesiony do nowej powłoki w katalogu tymczasowym, w którym możesz pracować na gałęzi. Możesz nawet użyć poleceń git w tym katalogu.
Kiedy skończysz, usuń katalog i uruchom:
git worktree prune
Odbywa się to również automatycznie w aliasie, przed dodaniem nowego drzewa roboczego.
Dziękujemy za prawidłowe użycie -z! Fajnie, że udostępniasz skrypt, który nie jest podatny na niektóre rodzaje ataków polegających na wstrzykiwaniu.
ErikE
0
Zdefiniowałem alias git, aby to osiągnąć (zanim znalazłem to pytanie).
Jest to krótka funkcja bash, która zapisuje bieżącą ścieżkę, przełącza się do repozytorium git, wykonuje wyewidencjonowanie i wraca tam, gdzie się zaczęła.
git checkto develop ~ / my_project_git
To np. Wyewidencjonowałoby gałąź deweloperską do katalogu "~ / my_project_git".
Służy git archive branch-index | tar -x -C your-folder-on-PCdo klonowania gałęzi do innego folderu. Myślę, że wtedy możesz skopiować dowolny plik, którego potrzebujesz
Odpowiedzi:
Jak w Czy „eksport git” (np. „Eksport svn”)?
Możesz
git checkout-index
do tego użyć , jest to polecenie niskiego poziomu, jeśli chcesz wyeksportować wszystko, możesz użyć-a
,Aby zacytować strony podręcznika:
Jeśli chcesz wyeksportować określony katalog, jest kilka sztuczek. Polecenie pobiera tylko pliki, a nie katalogi. Aby zastosować go do katalogów, użyj polecenia „find” i potokuj wyjście do git.
Również ze stron podręcznika:
źródło
GIT_WORK_TREE=../path/to/place git checkout
git worktree
(patrz poniżej) imho jest dzisiaj kanoniczną odpowiedzią i można ją tutaj dodać.Kolejne rozwiązanie, które jest nieco czystsze - wystarczy określić inne drzewo robocze.
Aby sprawdzić wszystko, od HEAD (nie indeksu) do określonego katalogu wyjściowego:
Aby pobrać podkatalog lub plik z HEAD do określonego katalogu:
źródło
--work-tree=/home/thomasg/okcopy
Raczej niż--work-tree=~/okcopy
(prawdopodobnie użycie ścieżki względnej podczas siedzenia w tym samym drzewie git również działa, ale w ten sposób leży szaleństwo igit status
wyjścia w R'lyehian)git status
wtedy pokazuje wiele modów (prawdopodobnie dlatego, że indeks pasuje teraz do innego katalogu, a nie do nietkniętego normalnego drzewa roboczego).git reset
przywrócił go do dobrego stanu.git status
pokazuje wiele modów igit reset
nie pomaga. Musiałemgit checkout -f HEAD
przywrócić stan mojego repozytorium.fatal: This operation must be run in a work tree
git reset
wystarczy przywrócić główne drzewo robocze do zdrowia. Aby bezpiecznie eksportować podkatalogi repozytorium w dowolnym SHA1, gałęzi lub tagu bez modyfikowania głównego drzewa roboczego, zobacz niesławne rozwiązanie Charlesa Baileya . Podobnie, aby bezpiecznie płacić za wiele oddziałów w tym samym czasie, nowa podkomenda jest Twoim przyjacielem.git archive
git worktree add
Dla pojedynczego pliku:
źródło
SHA1 ID
które można łatwo znaleźć poprzezgitk
. Gdybym tylko potrzebował "wyewidencjonować" ten plik do tymczasowej lokalizacji (tj. Nie przywracać),show
git show 82e54378856215ef96c5db1ff1160a741b5dcd70:MyProj/proguard/mapping.txt > myproj_mapping.txt
Jeśli pracujesz w ramach swojej funkcji i nie chcesz wracać do kasy, możesz uruchomić:
Stworzy
../myrepo_master
katalog zmaster
zatwierdzeniami gałęzi, w którym możesz kontynuować pracęźródło
git --work-tree=/path/to/outputdir checkout HEAD -- .
tego nie robi nic z indeksem, po prostu kopiuje wybraną gałąź do określonej lokalizacji (z dodatkiem pliku .git).myrepo_master
kataloggit worktree remove ../myrepo_master
Powyższe rozwiązania nie zadziałały, ponieważ musiałem sprawdzić konkretną otagowaną wersję drzewa. Nawiasem
cvs export
mówiąc , tak ma być używany.git checkout-index
nie przyjmuje argumentu znacznika, ponieważ pobiera pliki z indeksu.git checkout <tag>
zmieniłby indeks niezależnie od drzewa roboczego, więc musiałbym zresetować oryginalne drzewo. Rozwiązaniem, które działało dla mnie, było sklonowanie repozytorium. Udostępniony klon jest dość szybki i nie zajmuje dużo dodatkowej przestrzeni. W.git
razie potrzeby katalog można usunąć.Nowsze wersje git powinny obsługiwać
git clone --branch <tag>
automatyczne pobieranie określonego tagu:źródło
git --work-tree=/path/to/outputdir checkout <tag> -- .
nie działa dla Ciebie?Odpowiedź Adriana brzmiała „fatalna: ta operacja musi być przeprowadzona w drzewie roboczym”. Oto, co zadziałało dla nas.
Uwagi:
--no-checkout
Nie wypisuj niczego do nowego drzewa roboczego.--detach
Nie twórz nowej gałęzi dla nowego drzewa roboczego.<some-ref>
działa z każdym ref, na przykład, z którym działaHEAD~1
.git worktree prune
.źródło
Używam tego aliasu do wyewidencjonowywania gałęzi w katalogu tymczasowym:
Stosowanie:
Następnie zostaniesz przeniesiony do nowej powłoki w katalogu tymczasowym, w którym możesz pracować na gałęzi. Możesz nawet użyć poleceń git w tym katalogu.
Kiedy skończysz, usuń katalog i uruchom:
Odbywa się to również automatycznie w aliasie, przed dodaniem nowego drzewa roboczego.
źródło
Dodatek do odpowiedzi @ hasen . Aby wyświetlić listę plików do pobrania , możesz użyć
git ls-files
zamiastfind
:źródło
-z
! Fajnie, że udostępniasz skrypt, który nie jest podatny na niektóre rodzaje ataków polegających na wstrzykiwaniu.Zdefiniowałem alias git, aby to osiągnąć (zanim znalazłem to pytanie).
Jest to krótka funkcja bash, która zapisuje bieżącą ścieżkę, przełącza się do repozytorium git, wykonuje wyewidencjonowanie i wraca tam, gdzie się zaczęła.
To np. Wyewidencjonowałoby gałąź deweloperską do katalogu "~ / my_project_git".
To jest kod aliasu w środku
~/.gitconfig
:źródło
Służy
git archive branch-index | tar -x -C your-folder-on-PC
do klonowania gałęzi do innego folderu. Myślę, że wtedy możesz skopiować dowolny plik, którego potrzebujeszźródło