Я хочу использовать что-то похожее на:
git checkout -- <path>/<file>
но я хочу проверить файл на какую-то папку, которую я выбираю, вместо того, чтобы переписывать локальную /.
Любая идея?
Я хочу использовать что-то похожее на:
git checkout -- <path>/<file>
но я хочу проверить файл на какую-то папку, которую я выбираю, вместо того, чтобы переписывать локальную /.
Любая идея?
По Сделайте "git export" (например, "svn export" )?
Вы можете использовать git checkout-index
для этого, это команда низкого уровня, если вы хотите экспортировать все, вы можете использовать -a
,
git checkout-index -a -f --prefix=/destination/path/
Чтобы процитировать страницы руководства:
Важное значение имеет окончательный "/" [в префиксе]. Экспортированное имя буквально просто префикс указанной строки.
Если вы хотите экспортировать определенный каталог, есть некоторые трюки. Команда принимает только файлы, а не каталоги. Чтобы применить его к каталогам, используйте команду "найти" и выведите вывод на git.
find dirname -print0 | git checkout-index --prefix=/path-to/dest/ -f -z --stdin
Также из справочных страниц:
Интуитивность не является целью здесь. Повторяемость.
Другое решение, которое немного чище - просто укажите другое дерево работы.
Чтобы проверить все, начиная с вашего HEAD (не индекса) до определенного внешнего каталога:
git --work-tree=/path/to/outputdir checkout HEAD -- .
Чтобы проверить подкаталог или файл с вашего HEAD на конкретный каталог:
git --work-tree=/path/to/outputdir checkout HEAD -- subdirname
Для одного файла:
git show HEAD:abspath/to/file > file.copy
Вышеупомянутые решения не сработали для меня, потому что мне нужно было проверить конкретную тегированную версию дерева. То, что cvs export
предназначено для использования, кстати. git checkout-index
не принимает аргумент тега, поскольку он проверяет файлы из индекса. git checkout <tag>
изменит индекс независимо от рабочего дерева, поэтому мне нужно будет reset исходное дерево. Решение, которое сработало для меня, было клонирование хранилища. Общий клон довольно быстр и не занимает много места. При желании можно удалить каталог .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 worktree add ../myrepo_master master
Он создаст каталог ../myrepo_master
с фиксацией ветвления master
, где вы можете продолжить работу
Ответ Адриана "роковой: эта операция должна выполняться в дереве работ". Следующее - это то, что сработало для нас.
git worktree add <new-dir> --no-checkout --detach
cd <new-dir>
git checkout <some-ref> -- <existing-dir>
Примечания:
--no-checkout
Не проверяйте что-либо в новой рабочей строке.--detach
Не создавайте новую ветку для новой рабочей строки.<some-ref>
работает с любым ref, например, работает с HEAD~1
.git worktree prune
.Я определил псевдоним git для достижения именно этого (до того, как я нашел этот вопрос).
Это короткая функция bash, которая сохраняет текущий путь, переключается на репозиторий git, выполняет проверку и возвращается туда, где она была запущена.
git checkto develop ~/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"