У меня есть проект с git, и я просто хочу клонировать или вытащить определенный каталог, например myproject/javascript, как это делает subversion.
внесите некоторые изменения, зафиксируйте и снова отправьте.
Это возможно?
Как вытащить конкретный каталог с помощью git
Ответы (10)
- cd в верхнюю часть вашей копии репо
git fetch
git checkout HEAD path/to/your/dir/or/file
Где «
path/...
» в (3) начинается с каталога чуть ниже корня репо, содержащего ваш «.../file
»ЗАМЕТЬТЕ, что вместо «HEAD» может использоваться хэш-код конкретной фиксации, и тогда вы получите ревизию (файл) или ревизии (каталог), специфичные для этой фиксации.
--
не требуется. Он заставляет биты после него интерпретироваться как путь. Итак, да, если у вас есть файл с именем --help
, который вы хотите извлечь, потребуется префикс с этими дефисами: git checkout HEAD -- --help
- person Tim Visée; 01.12.2017
В пустой директории:
git init
git remote add [REMOTE_NAME] [GIT_URL]
git fetch REMOTE_NAME
git checkout REMOTE_NAME/BRANCH -- path/to/directory
fetch
или checkout
, мы можем просто сделать запрос на извлечение после команды remote add
, чтобы получить всю основную ветку.
- person Iqra.; 15.11.2018
После долгих поисков ответа, не находя, отказываясь, пытаясь снова и т. д., я наконец нашел решение этой проблемы в другом потоке SO:
Как git-pull все папки, кроме одной
Чтобы скопировать и вставить то, что есть:
git init
git remote add -f origin <url>
git config core.sparsecheckout true
echo <dir1>/ >> .git/info/sparse-checkout
echo <dir2>/ >> .git/info/sparse-checkout
echo <dir3>/ >> .git/info/sparse-checkout
git pull origin master
Чтобы сделать то, что хочет OP (работать только с одним каталогом), просто добавьте этот один каталог в .git/info/sparse-checkout
при выполнении описанных выше шагов.
Большое спасибо @cforbish !
master
. Просто убедитесь, что вы делаете git branch --set-upstream-to=origin/<branch>
правильно.
- person seebiscuit; 25.06.2018
Если вы хотите получить последние изменения в каталоге, не входя в него, вы можете сделать:
$ git -C <Path to directory> pull
Это невозможно. Вам нужно вытащить весь репозиторий или ничего.
Возможно, эта команда может быть полезна:
git archive --remote=MyRemoteGitRepo --format=tar BranchName_or_commit path/to/your/dir/or/file > files.tar
"И вуаля"
git clone --filter
из git 2.19 теперь работает на GitHub (проверено 18 сентября 2020 г., git 2.25.1)
Я не уверен насчет pull/fetch, но, по крайней мере, для первоначального клона эта опция была добавлена вместе с обновлением удаленного протокола, и она действительно предотвращает загрузку объектов с сервера.
Например, чтобы клонировать только объекты, необходимые для d1
этого репозитория: https://github.com/cirosantilli/test-git-partial-clone Я могу:
git clone \
--depth 1 \
--filter=blob:none \
--no-checkout \
https://github.com/cirosantilli/test-git-partial-clone \
;
cd test-git-partial-clone
git checkout master -- d1
Я рассмотрел это более подробно по адресу: Git: как клонировать подкаталог только репозитория Git?
Весьма вероятно, что все, что будет реализовано для git clone
в этой области, также будет иметь аналоги git pull
, но мне пока не удалось найти их очень легко.
Проверено и проверено, это работает!
mkdir <directory name> ; //Same directory name as the one you want to pull
cd <directory name>;
git remote add origin <GIT_URL>;
git checkout -b '<branch name>';
git config core.sparsecheckout true;
echo <directory name>/ >> .git/info/sparse-checkout;
git pull origin <pull branch name>
Надеюсь, это было полезно!
Иногда вы просто хотите взглянуть на предыдущие копии файлов без волокиты по просмотру различий.
В таком случае так же просто сделать клон репозитория и проверить конкретную фиксацию, которая вас интересует, и посмотреть подкаталог в этом клонированном репозитории. Поскольку все локально, вы можете просто удалить этот клон, когда закончите.
Для всей этой борьбы с теоретическими путями к файлам и примерами, как я, вот реальный пример: Microsoft предлагает свои документы и примеры на git hub, к сожалению, они собирают все свои файлы примеров для большого количества тем в этом репозитории:
https://github.com/microsoftarchive/msdn-code-gallery-community-s-z
Меня интересовали только файлы Microsoft Dynamics js в пути
msdn-code-gallery-community-s-z/Sdk.Soap.js/
поэтому я сделал следующее
создать
msdn-code-gallery-community-s-zSdkSoapjs\.git\info\sparse-checkout
файл в папке моих репозиториев на диске
git sparse-checkout init
в этом каталоге с помощью cmd в Windows
Содержимое файла
msdn-code-gallery-community-s-zSdkSoapjs\.git\info\sparse-checkout
is
Sdk.Soap.js/*
наконец сделать
git pull origin master