GIT: оформить заказ в определенную папку - PullRequest
111 голосов
/ 18 декабря 2010

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

git checkout -- <path>/<file>

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

Любойидея?

Ответы [ 9 ]

193 голосов
/ 11 мая 2013

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

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

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

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

git --work-tree=/path/to/outputdir checkout HEAD -- subdirname
48 голосов
/ 19 декабря 2010

Согласно Выполнить «экспорт git» (например, «svn export»)?

Для этого вы можете использовать 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

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

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

23 голосов
/ 19 декабря 2010

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

git show HEAD:abspath/to/file > file.copy
17 голосов
/ 07 ноября 2013

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

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

cd ./myrepo

git worktree add ../myrepo_master master

git worktree remove ../myrepo_master

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

4 голосов
/ 10 октября 2016

В ответ Адриана было «роковое: эта операция должна выполняться в рабочем дереве».Вот что сработало у нас.

git worktree add <new-dir> --no-checkout --detach
cd <new-dir>
git checkout <some-ref> -- <existing-dir>

Примечания:

  • --no-checkout Не извлекайте ничего в новое рабочее дерево.
  • --detach Не создавайте новую ветку для новогоworktree.
  • <some-ref> работает с любыми ссылками, например, работает с HEAD~1.
  • Очистка с git worktree prune.
0 голосов
/ 07 января 2019

Используйте git archive branch-index | tar -x -C your-folder-on-PC, чтобы клонировать ветку в другую папку. Я думаю, тогда вы можете скопировать любой файл, который вам нужен

0 голосов
/ 03 июня 2018

Я использую этот псевдоним для проверки ветки во временном каталоге:

[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

Это также выполняется автоматически в псевдониме перед добавлением нового рабочего дерева.

0 голосов
/ 08 октября 2015

Я определил псевдоним git для достижения именно этого (до того, как нашел этот вопрос).

Это короткая функция bash, которая сохраняет текущий путь, переключается на git-репо, выполняет проверку и возвращает туда, где она началась.

git check для разработки ~ / 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...