Мы будем использовать это внутри скрипта сборки Ant, работающего под TeamCity.Как использовать git для проверки только файлов и их родительских папок с заданным расширением?
ответ
Это то, что Я сделал, и он работает очень хорошо. Мне нужно было отредактировать только файлы markdown (расширения .md) в рамках проекта.
#clone as usual
git clone https://github.com/username/repo.git myrepo
#change into the myrepo directory that was just created
cd myrepo
#turn off tracking for everything
#this allows us to start pruning our working directory without the index
#being effected, leaving us only with the files that we want to work on
git ls-files | tr '\n' '\0' | xargs -0 git update-index --assume-unchanged
#turn on tracking for only the files that you want, editing the grep pattern
# as needed
#here I'm only going to track markdown files with a *.md extension
#notice the '--no-assume-unchanged' flag
git ls-files | grep \\.md | tr '\n' '\0' | xargs -0 git update-index --no-assume-unchanged
#delete everything in the directory that you don't want by reversing
#the grep pattern and adding a 'rm -rf' command
git ls-files | grep -v \\.md | tr '\n' '\0' | xargs -0 rm -rf
#delete empty directories (optional)
#run the following command. you'll receive a lot of 'no such file or
#directory' messages. run the command again until you
#no longer receive such messages.you'll need to do this several times depending on the depth of your directory structure. perfect place for a while loop if your scripting this
find . -type d -empty -exec rm -rf {} \;
#list the file paths that are left to verify everything went as expected
find -type f | grep -v .git
#run a git status to make sure the index doesn't show anything being deleted
git status
вы должны увидеть:
# On branch master
nothing to commit, working directory clean
сделано!
Теперь вы можете работать с этими файлами так же, как вы бы, как если бы у вас все проверили, в том числе делать тянуть и толкать к отдаленным и будет обновлять только те файлы, которые вы проверили, не удаляя остальные.
Очень круто. Благодаря! –
(Под «оформить заказ» Я предполагаю, что вы имеете в виду «клон» в мерзавца терминологии. - то есть вы в настоящее время не имеют копию репозитория, и нужно, чтобы получить некоторые файлы из удаленного хранилища)
Короткий ответ заключается в том, что вы не можете.
Вы можете, с некоторыми ограничениями, сделать неглубокие клоны в мерзавец (только получать последние несколько версий), но вы не можете легко сделать узкие клонов (заедание только некоторые части хранилища, такими как один подкаталог или только файлы, соответствующие определенным критериям).
В какой-то мере это функция git как система управления распределенной версией: когда вы клонировали репозиторий, вы знаете, что у вас есть полная история, все ветви и все, что вам нужно для работы на код полностью автономный.
Есть, конечно, различные способы обойти это, например:
- вы могли бы использовать
git archive --remote=<repo>
для извлечения архива дегтя удаленного хранилища, и трубы, чтобыtar -x --wildcards --no-anchored '*.whatever'
- просто клонировать полный хранилище где-нибудь еще на месте, и есть обновлять его в сценарии сборки и скопировать только файлы, которые вы хотите
- и т.д. и т.п.
Спасибо, Марк. Я понимаю, что то, о чем я прошу, идет «против зерна» за то, ради чего предназначался GIT. Мне нужно сделать еще несколько домашних заданий о том, как TeamCity работает с клонированием GIT. Я подозреваю, что ваше предложение может быть полезным в этом контексте. –
Что у вас есть? – alex
В настоящее время мы используем Subversion (переход на Git в ближайшее время), и мы вынуждены проверять большие панели репозитория SVN (списки каталогов), а затем искать с использованием шаблонов файлов Ant. Работает, но идет медленно. –
AFAIK API Subversion не поддерживает этот тип поиска и проверки на основе шаблонов. Я не проверял последний v1.7 - но мы все равно переезжаем в Git. Некоторое время назад я отправил запрос на оформление на основе шаблонов в группу Subverison, но задался вопросом, не сделал ли Git это. В качестве альтернативы может быть другой способ, основанный на генерации команд git. –