Почему git sparse checkout оставляет после себя каталоги?
Немного предыстории: сервисная модель моей компании начиналась как модель сервера на основе устройства. Мы отправили бы нашему клиенту сервер с Windows Server 2003/2008, предварительно загруженный веб-сервером и нашим программным обеспечением. Мы перемещаем всю клиентскую конфигурацию в Git-репозиторий и используем sparse-checkout, чтобы каждый сервер содержал только то, что необходимо для правильной работы программного обеспечения клиента.
При настройке sparse-checkout мы столкнулись с огромным несоответствием. Хорошо делать
git clone git@github.com:ourclientconfigrepo.git .
git config core.sparsecheckout true
echo www.thisclient.com/ > .git/info/sparse-checkout
git read-tree -m -u HEAD
Ожидаемый результат будет
ls
www.thisclient.com/
но мы получаем
ls
www.thisclient.com/
www.randomclient1.com/
www.randomclient2.com/
www.randomclient3.com/
Я пробовал несколько раз, в новом каталоге каждый раз, и проблема возникала каждый раз. Мой джиу-гит-су подводит меня здесь. Мы используем git версии 1.8.1.msysgit.1.
Спасибо за вашу помощь, дайте мне знать, если мне нужно предоставить больше информации.
--- РЕДАКТИРОВАТЬ 1 ---
Пояснение: репозиторий - это не что иное, как каталоги конфигурации нашего клиента. У каждого клиента есть свой каталог в репозитории, и мы пытаемся разрозниться на каждом сервере каждого клиента, поэтому мы пытаемся исключить все, кроме рассматриваемого клиента.
--- РЕДАКТИРОВАТЬ 2 ---
Просто обновление, оказалось, что это было что-то странное с разрешениями папок Windows, и Git пытался удалить непустые каталоги. Исправлено путем удаления пустых папок. Спасибо за все попытки помочь!
2 ответа
Частичное решение: Согласно git-read-tree (1), вы можете исключить определенные файлы, поставив! перед именем файла. Однако это может быть неверно написано (это означает, что это относится и к каталогам, а не к файлам).
Я продолжу расследование.
Согласно /questions/25862732/pochemu-isklyuchennyie-fajlyi-prodolzhayut-poyavlyatsya-v-moem-git-sparse-checkout/25862749#25862749, вы можете вручную пометить каталоги как git update-index --skip-worktree www.randomclient1.com/
,
/questions/30557458/git-razrezhennyie-proverki-s-isklyucheniem/30557477#30557477 подразумевает, что исключение только для каталогов, и говорит, что с ним есть некоторые ошибки.
Ваша операция клонирования не является правильным способом создания разреженного клона. Вместо:
git clone ...
Вы должны использовать эту последовательность:
mkdir repo ; cd repo ; 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