Відповіді:
Відповідно до "git експорту" (наприклад, "SVN-експорт")?
Ви можете використовувати git checkout-indexдля цього, це команда низького рівня, якщо ви хочете експортувати все, ви можете використовувати -a,
git checkout-index -a -f --prefix=/destination/path/
Щоб процитувати чоловікові сторінки:
Заключний "/" [у префіксі] є важливим. Експортоване ім'я буквально є префіксом вказаного рядка.
Якщо ви хочете експортувати певний каталог, є деякі хитрощі. Команда бере лише файли, а не каталоги. Щоб застосувати його до каталогів, використовуйте команду 'find' та передайте вихід на git.
find dirname -print0 | git checkout-index --prefix=/path-to/dest/ -f -z --stdin
Також зі сторінки man:
Тут не мета інтуїтивності. Повторність є.
GIT_WORK_TREE=../path/to/place git checkout
git worktree(див. нижче) Імхо сьогодні є канонічною відповіддю і може бути додано тут.
Ще одне рішення, яке є більш чистим - просто вкажіть інше дерево роботи.
Щоб перевірити все від вашої HEAD (не індексу) до конкретного каталогу:
git --work-tree=/path/to/outputdir checkout HEAD -- .
Щоб перевірити підкаталог або файл з вашої HEAD в певний каталог:
git --work-tree=/path/to/outputdir checkout HEAD -- subdirname
--work-tree=/home/thomasg/okcopyа не --work-tree=~/okcopy(можливо, використання відносного шляху, сидячи всередині одного і того ж дерева git, теж працює, але таким чином лежить божевілля і git statusрезультати в R'lyehian)
git statusпотім показує багато модів (імовірно, тому, що індекс зараз відповідає іншому каталогу, а не недоторканому нормальному робочому дереву). git resetповернув його до хорошого стану.
git statusпоказано багато модів, і git resetце не допомагає. Мені довелося git checkout -f HEADвідновити стан мого репо.
fatal: This operation must be run in a work tree
git resetдля відновлення основного робочого дерева достатньо для чистоти . Щоб безпечно експортувати підкаталоги репозиторію в будь-який SHA1, відділення або тег, не змінюючи головне робоче дерево, див . Сумнозвісне git archiveрішення Чарльза Бейлі . Так само, щоб безпечно перевірити кілька відділень одночасно, нова git worktree addпідкоманда - ваш друг.
Для одного файлу:
git show HEAD:abspath/to/file > file.copy
SHA1 IDщо легко знайти через gitk. Якщо мені потрібно лише "зарахувати" цей файл у тимчасове місце (тобто не повернутись), я б використав showпідкоманду:git show 82e54378856215ef96c5db1ff1160a741b5dcd70:MyProj/proguard/mapping.txt > myproj_mapping.txt
Вищезазначені рішення для мене не спрацювали, тому що мені потрібно було перевірити конкретну теговану версію дерева. Ось як cvs exportмається на увазі використовуватись, до речі. git checkout-indexне приймає аргумент тегу, оскільки він перевіряє файли з індексу. git checkout <tag>змінив би індекс незалежно від робочого дерева, тому мені потрібно скинути початкове дерево. Рішенням, яке працювало для мене, було клонування сховища. Спільний клон досить швидкий і не займає багато зайвого місця. .gitКаталог може бути видалений , якщо це необхідно.
git clone --shared --no-checkout <repository> <destination>
cd <destination>
git checkout <tag>
rm -rf .git
Новіші версії git повинні підтримувати автоматичну git clone --branch <tag>перевірку зазначеного тегу:
git clone --shared --branch <tag> <repository> <destination>
rm -rf <destination>/.git
git --work-tree=/path/to/outputdir checkout <tag> -- .не працював для вас?
Якщо ви працюєте за своєю функцією і не хочете повернутись до майстра, ви можете запустити:
cd ./myrepo
git worktree add ../myrepo_master master
git worktree remove ../myrepo_master
Це створить ../myrepo_masterкаталог з masterфілійними комітами, де ви зможете продовжувати роботу
git --work-tree=/path/to/outputdir checkout HEAD -- .цього не робить нічого в індексі, просто копіює вибрану гілку у вказане місце (з додаванням .git-файлу).
myrepo_masterкаталог
git worktree remove ../myrepo_master
Відповідь Адріана кинула "фатально: цю операцію потрібно виконати в робочому дереві". Далі - те, що працювало для нас.
git worktree add <new-dir> --no-checkout --detach
cd <new-dir>
git checkout <some-ref> -- <existing-dir>
Примітки:
--no-checkout Не забувайте нічого про нове робоче дерево.--detach Не створюйте нову гілку для нового робочого дерева.<some-ref>наприклад, працює з будь-яким посиланням, наприклад, воно працює HEAD~1.git worktree prune.Доповнення до відповіді @ hasen . Список файлів для оформлення замовлення , ви можете використовувати git ls-filesзамість find:
git ls-files -z *.txt | git checkout-index --prefix=/path-to/dest/ -f -z --stdin
-z! Приємно, що ви надаєте сценарій, який не вразливий до певних видів ін'єкційних атак.
Я визначив псевдонім git, щоб досягти саме цього (перш ніж я знайшов це питання).
Це коротка функція bash, яка зберігає поточний шлях, переходить на git repo, робить замовлення і повертається туди, де він розпочався.
git checkto розвивати ~ / my_project_git
Це, наприклад, зарахує гілку розробки в каталог "~ / my_project_git".
Це псевдонім коду всередині ~/.gitconfig:
[alias]
checkTo = "!f(){ [ -z \"$1\" ] && echo \"Need to specify branch.\" && \
exit 1; [ -z \"$2\" ] && echo \"Need to specify target\
dir\" && exit 2; cDir=\"$(pwd)\"; cd \"$2\"; \
git checkout \"$1\"; cd \"$cDir\"; };f"
Я використовую цей псевдонім для перевірки філії у тимчасовому каталозі:
[alias]
cot = "!TEMP=$(mktemp -d); f() { git worktree prune && git worktree add $TEMP $1 && zsh -c \"cd $TEMP; zsh\";}; f" # checkout branch in temporary directory
Використання:
git cot mybranch
Потім вас скидають у нову оболонку у тимчасовому каталозі, де ви можете працювати у відділенні. Ви навіть можете використовувати команди git у цьому каталозі.
Закінчивши, видаліть каталог і запустіть:
git worktree prune
Це також робиться автоматично в псевдонімі перед тим, як додати нове робоче дерево.