2010-03-11 4 views
104

У меня есть проект с git, и я просто хочу клонировать или тянуть конкретный каталог, например myproject/javascript, как и подрывная деятельность.
внести некоторые изменения, зафиксировать и отодвинуть назад.
Возможно?Как вытащить конкретный каталог с git

+3

редкое оформление может вас заинтересовать (даже если вам все равно нужно достать все): см. Http://stackoverflow.com/questions/2416815/how-to-git-pull-all-but-one-folder/2416991# 2416991 – VonC

ответ

143
  1. CD в ​​верхней части копии репо
  2. git fetch
  3. git checkout HEAD path/to/your/dir/or/file

    • Где "path/..." в (3) начинается в каталоге чуть ниже корень репо, содержащий ваши ".../file"
+2

Это ответ ... спасибо! – Paul

+1

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

+0

Вы обратились к названию вопроса, который достаточно хорош. Это только спасло меня, насколько мне известно, это правильный ответ - тем более, что это был лучший удар по Google для этой проблемы. – Morgon

15

Невозможно. Вам нужно вытащить весь репозиторий или ничего.

+1

Несмотря на то, что вам нужно * вытащить * все, будет ли интересным заниматься в дереве редкое рабочее дерево? См. Http://stackoverflow.com/questions/2416815/how-to-git-pull-all-but-one-folder/2416991#2416991 – VonC

+10

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

+0

Ответ vergueishon ниже работал для меня. – Paul

-1

Shingara является правильным. Объяснение этого поведения приведено в this mailing list thread. Если вы действительно хотите это сделать, вы можете сделать javascript dir подмодулем.

+3

Вы не ответили на вопрос в своем комментарии, вы предоставили ссылку. Если ссылка когда-либо гаснет, ваша ссылка бесполезна, как и ваш ответ. Кроме того, что на ссылке не очень лаконично и легко читать. Ваш ответ был бы полезен, если бы вы обобщили или упростили то, что было в ссылке. – leetNightshade

0

Иногда вы просто хотите взглянуть на предыдущие копии файлов без осколков пробега через diff.

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

4

Я вижу. Я попробую создать подмодули и посмотреть, работает ли для меня. Я сообщу результаты. EDIT: Редкие проверки и подмодули разработаны для меня.Ссылки, которые я использовал, чтобы прочитать о (дается VonC и Мишель Jansen) являются:

How to git-pull all but one folder

http://www.kernel.org/pub/software/scm/git/docs/git-read-tree.html#_sparse_checkout

http://vmiklos.hu/blog/sparse-checkout-example-in-git-1-7

http://www.kernel.org/pub/software/scm/git/docs/git-read-tree.html#_sparse_checkout

git submodule update

+0

Особенность подмодуля git не особенно хорошо реализована. Они могут быть очень неудобными и запутанными для работы. Лично я бы хорошо избегал подмодулей git, пока все изломы не исчезли. – user2268788

7

Возможно, эта команда может быть полезна:

git archive --remote=MyRemoteGitRepo --format=tar BranchName_or_commit path/to/your/dir/or/file > files.tar 

«вуаля»

+2

Это загружает конкретный каталог файла для целей архивирования это не вытаскивает копию, которую вы можете изменить и отодвинуть назад. – leetNightshade

46

В пустом каталоге:

git init 
git remote add [REMOTE_NAME] [GIT_URL] 
git fetch REMOTE_NAME 
git checkout REMOTE_NAME/BRANCH -- path/to/directory 
+5

Это сработало для меня, когда принятого ответа не было. –

+4

Это правильный ответ на ОП. –

+0

Это работает, если вы хотите использовать удаленную версию файла для замены локального файла, я думаю, – John

8

После долгих поисков ответа, не находя, отказавшись, пытаясь снова и так далее, я, наконец, нашел решение это в другой теме: SO

How to git-pull all but one folder

Чтобы скопировать и вставить то, что там:

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!

+2

Я размещаю его здесь в основном потому, что всякий раз, когда я пытаюсь Google, как это сделать, это лучший результат, и этот поток даже близко к отображению. :(Я чувствую плохое копирование, но я считаю, что это лучшие методы? – msb

Смежные вопросы