2011-08-18 2 views
1

Мы будем использовать это внутри скрипта сборки Ant, работающего под TeamCity.Как использовать git для проверки только файлов и их родительских папок с заданным расширением?

+0

Что у вас есть? – alex

+0

В настоящее время мы используем Subversion (переход на Git в ближайшее время), и мы вынуждены проверять большие панели репозитория SVN (списки каталогов), а затем искать с использованием шаблонов файлов Ant. Работает, но идет медленно. –

+0

AFAIK API Subversion не поддерживает этот тип поиска и проверки на основе шаблонов. Я не проверял последний v1.7 - но мы все равно переезжаем в Git. Некоторое время назад я отправил запрос на оформление на основе шаблонов в группу Subverison, но задался вопросом, не сделал ли Git это. В качестве альтернативы может быть другой способ, основанный на генерации команд git. –

ответ

1

Это то, что Я сделал, и он работает очень хорошо. Мне нужно было отредактировать только файлы 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 

сделано!

Теперь вы можете работать с этими файлами так же, как вы бы, как если бы у вас все проверили, в том числе делать тянуть и толкать к отдаленным и будет обновлять только те файлы, которые вы проверили, не удаляя остальные.

+0

Очень круто. Благодаря! –

1

(Под «оформить заказ» Я предполагаю, что вы имеете в виду «клон» в мерзавца терминологии. - то есть вы в настоящее время не имеют копию репозитория, и нужно, чтобы получить некоторые файлы из удаленного хранилища)

Короткий ответ заключается в том, что вы не можете.

Вы можете, с некоторыми ограничениями, сделать неглубокие клоны в мерзавец (только получать последние несколько версий), но вы не можете легко сделать узкие клонов (заедание только некоторые части хранилища, такими как один подкаталог или только файлы, соответствующие определенным критериям).

В какой-то мере это функция git как система управления распределенной версией: когда вы клонировали репозиторий, вы знаете, что у вас есть полная история, все ветви и все, что вам нужно для работы на код полностью автономный.

Есть, конечно, различные способы обойти это, например:

  1. вы могли бы использовать git archive --remote=<repo> для извлечения архива дегтя удаленного хранилища, и трубы, чтобы tar -x --wildcards --no-anchored '*.whatever'
  2. просто клонировать полный хранилище где-нибудь еще на месте, и есть обновлять его в сценарии сборки и скопировать только файлы, которые вы хотите
  3. и т.д. и т.п.
+0

Спасибо, Марк. Я понимаю, что то, о чем я прошу, идет «против зерна» за то, ради чего предназначался GIT. Мне нужно сделать еще несколько домашних заданий о том, как TeamCity работает с клонированием GIT. Я подозреваю, что ваше предложение может быть полезным в этом контексте. –