Оформить заказ одним файлом из Subversion
"Невозможно извлечь один файл. Наилучший уровень проверок, который вы можете сделать, находится на уровне каталога".
Как мне обойти эту проблему при использовании Subversion?
У нас есть эта папка в Subversion, где мы храним все наши изображения. Я просто хочу проверить один файл (изображение) из этого. Эта папка действительно большая и содержит множество других вещей, которые мне сейчас не нужны.
19 ответов
Ответ прост: вы svn export
файл вместо того, чтобы проверить его.
Но это может быть не то, что вы хотите. Возможно, вы захотите поработать над файлом и снова зарегистрировать его, не загружая ненужную ГБ.
Если у вас Subversion 1.5+, тогда сделайте редкую проверку:
svn checkout <url_of_big_dir> <target> --depth empty
cd <target>
svn up <file_you_want>
Для более старой версии SVN вы можете воспользоваться следующими преимуществами:
- Оформите каталог, используя ревизию в далеком прошлом, когда он был менее полон мусора, который вам не нужен.
- Обновите нужный файл, чтобы создать смешанную ревизию. Это работает, даже если файл не существует в проверенной вами ревизии.
- Прибыль!
Альтернатива (например, если в каталоге слишком много мусора прямо из ревизии, в которой он был создан) - сделать копию URL->URL-адреса нужного вам файла в новом месте в хранилище (фактически это рабочая ветка файла). Проверьте этот каталог и сделайте ваши изменения.
Я не уверен, сможете ли вы затем объединить вашу измененную копию обратно в хранилище без рабочей копии цели - мне это никогда не требовалось. Если так, то сделай это.
Если нет, то, к сожалению, вам, возможно, придется найти кого-то другого, у которого действительно есть весь каталог, и заставить его сделать это. Или, может быть, к тому времени, когда вы внесете свои изменения, остальная часть закончит загрузку...
Пытаться svn export
вместо svn checkout
, Это работает для отдельных файлов.
Причиной ограничения является то, что checkout
создает рабочую копию, которая содержит метаинформацию о хранилище, ревизии, атрибутах и т. д. Эти метаданные хранятся в подкаталогах с именем ".svn". И отдельные файлы не имеют подкаталогов.
Использование svn cat
или же svn export
,
Для этого вам не нужно извлекать рабочий каталог, но вы не сможете зафиксировать любые сделанные вами изменения. Если вам нужно внести изменения и зафиксировать их, вам нужен рабочий каталог, но вам не нужно извлекать его полностью. Извлеките ревизию, в которой каталог был еще / почти пуст, а затем используйте 'svn cat', чтобы извлечь файл из HEAD.
Вы можете сделать это в два этапа:
Извлечь пустой SVN-репозиторий только с метаинформацией:
$ cd /tmp $ svn co --depth empty http://svn.your.company.ca/training/trunk/sql
Бежать
svn up
обновить указанный файл:$ svn up http://svn.your.company.ca/training/trunk/sql/showSID.sql
Если вы хотите просмотреть readme.txt в своем хранилище, не проверяя его:
$ svn cat http://svn.red-bean.com/repos/test/readme.txt
Это файл README. Вы должны прочитать это.Совет: Если ваша рабочая копия устарела (или у вас есть локальные изменения), и вы хотите видеть ревизию HEAD файла в вашей рабочей копии, svn cat автоматически получит ревизию HEAD, когда вы дадите ей путь:
$ cat foo.c
Этот файл находится в моей локальной рабочей копии и содержит изменения, которые я внес.$ svn cat foo.c
Последняя ревизия свежая из репозитория!
Ниже приводится эквивалентное решение TortoiseSVN для принятого ответа (я написал это во внутреннем документе для моей компании, поскольку мы вновь внедряем SVN). Я думал, что было бы полезно поделиться здесь также:
Извлечение одного файла: Subversion не поддерживает извлечение одного файла, а только извлечение структур каталогов. (Ссылка: http://subversion.tigris.org/faq.html). Это связано с тем, что для каждого каталога, который извлекается как рабочая копия, метаданные, касающиеся изменений / версий файлов, хранятся в виде внутренней скрытой папки (.svn/_svn). Это не поддерживается в настоящее время (v1.6) для отдельных файлов.
Альтернативная рекомендуемая стратегия: Вам нужно будет выполнить часть каталога извлечения только один раз, после чего вы можете напрямую перейти и оформить отдельные файлы. Выполните редкую проверку родительской папки и структуры каталогов. Разреженная проверка в основном проверяет только структуру папок без заполнения файлов содержимого. Таким образом, вы извлекаете только структуры каталогов и не должны извлекать ВСЕ файлы, как это было важно. Ссылка: http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-checkout.html
Шаг 1. Перейдите в браузер хранилища
Шаг 2: Щелкните правой кнопкой мыши родительскую папку в хранилище, содержащую все файлы, с которыми вы хотите работать, и выберите "Оформить заказ".
Шаг 3: В новом всплывающем окне убедитесь, что каталог проверки указывает на правильное местоположение на вашем локальном ПК. Также будет раскрывающееся меню с надписью "глубина проверки". Выберите "Только этот элемент" или "Непосредственные дети, включая папки", в зависимости от ваших требований. Второй вариант рекомендуется, так как, если вы хотите работать с вложенной папкой, вы можете напрямую перейти в следующий раз, в противном случае вам придется повторить всю эту процедуру еще раз для вложенной папки.
Шаг 4: Родительская папка (и) теперь должна быть доступна в выбранной вами папке и теперь отслеживается с помощью SVN (теперь должна присутствовать скрытая папка ".svn" или "_svn"). Теперь в репозитории щелкните правой кнопкой мыши по одному файлу, который вы хотите получить отдельно, и выберите опцию "Обновить элемент до ревизии". Один файл теперь может быть обработан и возвращен в хранилище.
Надеюсь, это поможет.
Обновление на случай, если вам действительно нужно, может быть включено в файл, извлеченный из другой папки.
Начиная с SVN 1.6 вы можете создавать внешние файлы, своего рода ссылки на SVN. Это означает, что у вас может быть другая версионная папка, содержащая один файл. Внесение изменений в файл в извлечении из этой папки также возможно.
Это очень просто, извлеките папку, в которую вы хотите включить файл, и просто добавьте свойство в папку
svn propedit svn:externals .
с таким содержанием:
file.txt /repos/path/to/file.txt
После того, как вы подтвердите это, файл появится в будущих извлечениях папки. В основном это работает, но есть некоторые ограничения, как описано в документации, указанной выше.
cd C:\path\dir
svn checkout https://server/path/to/trunk/dir/dir/parent_dir--depth empty
cd C:\path\dir\parent_dir
svn update filename.log
(Изменить имя файла.log)
svn commit -m "this is a comment."
Сделайте что-то вроде этого:
mkdir <your directory>/repos/test
svn cat http://svn.red-bean.com/repos/test/readme.txt > <your directory>/repos/test/readme.txt
По сути, идея состоит в том, чтобы создать каталог, в который вы хотите получить файл из SVN. Использовать svn cat
команда и перенаправить вывод в файл с тем же именем. По умолчанию кошка будет сбрасывать информацию на stdio.
Перейдите в браузер репозитория, щелкните правой кнопкой мыши файл и используйте "Сохранить как", хотя я использую TortoiseSVN.
Я бы просто просмотрел его и экспортировал один файл. Если у вас есть доступ HTTP, просто используйте веб-браузер, чтобы найти файл и взять его.
Если вам нужно вернуть его после редактирования, это может быть немного более утомительным, но я уверен, что может быть svn import
функция...
Ответ Стива Джессопа не сработал для меня. Я читаю файлы справки для SVN, и если у вас просто есть изображение, вы, вероятно, не хотите проверять его снова, если вы не пользуетесь Photoshop, поэтому экспорт - это лучшая команда, чем извлечение, поскольку она не версионная (но она незначительна).
И --depth ARG должен быть не пустым, а файлами, чтобы получить файлы в ближайшем каталоге. Таким образом, вы получите все поля, не только одно, но пустое ничего не возвращает из хранилища.
svn co --depth files <source> <local dest>
или же
svn export --depth files <source> <local dest>
Что касается других ответов, cat позволяет вам читать контент, который хорош только для текста, а не изображения всех вещей.
Используя метод разреженного извлечения, вы МОЖЕТЕ проверить конкретный файл, который уже извлечен или существует... с помощью простого трюка:
После проверки верхнего уровня вашего репозитория с помощью опции "только этот элемент" в проводнике Windows вы ДОЛЖНЫ сначала щелкнуть правой кнопкой мыши файл, который необходимо обновить; выберите Repo Browser в контекстном меню; найдите этот файл СНОВА в браузере хранилища и щелкните правой кнопкой мыши. Теперь вы должны увидеть "обновить элемент до ревизии" в контекстном меню.
Я не уверен, что это недокументированная функция или просто ошибка. Мне понадобилось много времени после работы, чтобы наконец найти этот трюк. Я использую TortoiseSVN 1.6.2.
С Subversion 1.5 становится возможным извлекать (все) файлы каталога без проверки каких-либо подкаталогов (различные флаги --depth). Не совсем то, что вы просили, но форма "меньше всего".
Эта проблема покрыта:
http://subversion.tigris.org/issues/show_bug.cgi?id=823
Прилагается скрипт, который позволяет вам извлечь один файл из svn, внести изменения и зафиксировать изменения обратно в хранилище, но вы не можете запустить "svn up" для извлечения остальной части каталога. Он был протестирован с SVN-1.3, 1.4 и 1.6.
Если вы просто хотите файл без информации о ревизии, используйте
svn export <URL>
Поскольку ни один из других ответов не работал для меня, я сделал это, используя этот хак:
$ cd /yourfolder
svn co https://path-to-folder-which-has-your-files/ --depth files
Это создаст новую локальную папку, в которой будут только файлы с удаленного пути. Затем вы можете сделать символическую ссылку на файлы, которые вы хотите иметь здесь.
Я хотел извлечь один файл в каталог, который не был частью рабочей копии.
Получим файл по следующему URL: http://subversion.repository.server/repository/module/directory/myfile
svn co http://subversion.repository.server/repository/module/directory/myfile /**directoryb**
Таким образом, я проверил данный каталог, содержащий целевой файл, который я хотел получить в фиктивном каталоге (скажем, etcb для URL, заканчивающегося на /etc
).
Затем я очистил файл .svn/ records от всех файлов целевого каталога, которые мне не нужны, чтобы оставить только файл, который я хотел. В этом файле.svn/ records у вас есть запись для каждого файла с его атрибутами, поэтому оставьте только запись, касающуюся файла, который вы хотите получить и сохранить.
Теперь вам нужно просто скопировать ".svn" в каталог, который будет новой "рабочей копией". Тогда вам просто нужно:
cp .svn /directory
cd /directory
svn update myfile
Теперь каталог находится под контролем версий. Не забудьте удалить каталог directoryb, который был просто "временной рабочей копией".
Если вы просто хотите экспортировать файл, и вам не нужно будет обновлять его позже, вы можете сделать это без использования команд SVN.
Используя TortoiseSVN Repository Browser, выберите файл, щелкните правой кнопкой мыши, а затем выберите "Копировать URL в буфер обмена". Вставьте этот URL в ваш браузер, и после входа в систему вам будет предложено загрузить файл.
Таким образом, вы также можете выбрать нужную версию и загрузить старую версию файла.
Обратите внимание, что это действительно, если ваш сервер SVN имеет веб-интерфейс.