Как использовать git для извлечения только файлов и их родительских папок с заданным расширением? - PullRequest
1 голос
/ 18 августа 2011

Мы будем использовать это в скрипте сборки Ant, работающем под TeamCity.

Ответы [ 2 ]

1 голос
/ 26 мая 2014

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

сделано!

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

1 голос
/ 18 августа 2011

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

Короткий ответ: вы не можете.

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

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

Конечно, есть разные способы, например:

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