GIT: Оформить заказ в определенной папке

Я хочу использовать что-то похожее на:

git checkout -- <path>/<file>

но я хочу проверить файл на какую-то папку, которую я выбираю, вместо того, чтобы переписывать локальную /.

Любая идея?

Ответ 1

По Сделайте "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

Также из справочных страниц:

Интуитивность не является целью здесь. Повторяемость.

Ответ 2

Другое решение, которое немного чище - просто укажите другое дерево работы.

Чтобы проверить все, начиная с вашего HEAD (не индекса) до определенного внешнего каталога:

git --work-tree=/path/to/outputdir checkout HEAD -- .

Чтобы проверить подкаталог или файл с вашего HEAD на конкретный каталог:

git --work-tree=/path/to/outputdir checkout HEAD -- subdirname

Ответ 3

Для одного файла:

git show HEAD:abspath/to/file > file.copy

Ответ 4

Вышеупомянутые решения не сработали для меня, потому что мне нужно было проверить конкретную тегированную версию дерева. То, что 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

Ответ 5

Если вы работаете под своей функцией и не хотите возвращаться к мастеру, вы можете запустить:

git worktree add ../myrepo_master master

Он создаст каталог ../myrepo_master с фиксацией ветвления master, где вы можете продолжить работу

Ответ 6

Ответ Адриана "роковой: эта операция должна выполняться в дереве работ". Следующее - это то, что сработало для нас.

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.

Ответ 7

Я определил псевдоним 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"