Оформить заказ одним файлом из 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.

Вы можете сделать это в два этапа:

  1. Извлечь пустой SVN-репозиторий только с метаинформацией:

    $ cd /tmp
    
    $ svn co --depth empty http://svn.your.company.ca/training/trunk/sql
    
  2. Бежать 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 имеет веб-интерфейс.

Другие вопросы по тегам