LINUX.ORG.RU

sparse checkout без полного пути к директории

 ,


0

4

Что я делаю:

git worktree add --no-checkout <path_of_worktree> <hash_of_commit>
cd <path_of_worktree>
git sparse-checkout init
git sparse-checkout set dir1/dir2/dir3/*
git checkout

Это работает, но не совсем так, как мне нужно - создаётся полная цепочка директорий dir1/dir2/dir3, а мне надо, чтобы внутри worktree всё начиналось с dir3 или даже сразу с его содержимого. Как этого добиться средствами Git, не прибегая к симлинкам и прочим извращениям?

★★★★★

Последнее исправление: bbk123 (всего исправлений: 1)

Ответ на: комментарий от bbk123

Ой ли? Это там нормальная практика чекаутить репы по отдельным путям, а в git коммит — цельный снепшот всего кода

deadplace
()

Sparse checkout не позволяет менять пути файлов, это принципиально противоречит архитектуре.

Сделать, чтобы начиналось с dir3, можно с помощью subtree merge (git subtree) Че-то проглючило меня, этой штукой можно только увеличить вложенность :)

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)
Ответ на: комментарий от bbk123

Svn тут не причём

Если исходный репозиторий хостится на гитхабе, то можно выкачать подкаталог через клиент svn (или git-svn), используя поддержку на стороне сервера. Это пожалуй самый простой способ достичь желаемого.

https://github.community/t/how-can-i-download-a-specific-folder-from-a-github-repo/278/20

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)
Ответ на: комментарий от bbk123

Ну мне лучше знать для чего это понадобилось. Svn тут не причём.

Это все пошло из svn и монореп. sparse checkout появился как костыль для чекаута больших кусков кода отдельно друг от друга. В git его прикрутили сбоку, поэтому счекаутить одну сабдиректорию нельзя. В svn можно любой кусок счекаутить из любого положения в дереве.

xpahos ★★★★★
()
Последнее исправление: xpahos (всего исправлений: 1)
Ответ на: комментарий от xpahos

Это есть и в других VCS, например в Perforce. Откуда это пошло или кто у кого позаимствовал идею - не важно. Мне нужно лишь иметь возможность переключить кусок дерева на другую версию, не переключая всё дерево. Если это можно сделать сразу, без дополнительного чекаута, то ещё лучше.

bbk123 ★★★★★
() автор топика

Подписываюсь, тоже интересно. Пару лет назад пытался сделать такое, в итоге так и не смог. Тоже крутил-вертел этот sparse-checkout, всё впустую.

Irben ★★★
()
Ответ на: комментарий от bbk123

Мне нужно лишь иметь возможность переключить кусок дерева на другую версию, не переключая всё дерево.

git checkout other-version -- dir1/dir2/dir3/

Но при этом все изменения будут в индексе. Потом можно использовать git update-index --skip-worktree, но тогда никакие изменения тех файлов не будут видны. Так что зависит от сценария использования.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Да, git checkout other-version -- dir1/dir2/dir3/ и обратно git checkout HEAD -- dir1/dir2/dir3/ работает. Спасибо.

bbk123 ★★★★★
() автор топика

Ещё одно решение, получить dir3 просто как копию файлов определённой версии:

git archive --format=tar 7c9ce6677927aad905cca71178abf78d6daed472:dir1/dir2/dir3 . | tar x -C dir3_v

Пустую директорию dir3_v нужно создать заранее.

bbk123 ★★★★★
() автор топика
Последнее исправление: bbk123 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.