У меня есть проблема, которую я плохо описываю в другом вопросе. Я публикую это, чтобы прояснить, что я хочу сделать и с какой проблемой я сталкиваюсь. Есть ответ с высоким рейтингом, но на самом деле он не решает мою проблему (короткая история: я не пытаюсь добавить каталог с символическими ссылками в мой проект с управлением версиями).
Если вы уже знаете, как работает Subversion, перейдите к ниже, чтобы получить актуальный вопрос.
Я в командной строке, и текущим рабочим каталогом является мой домашний каталог.
$> pwd
/home/user
У меня есть проект SVN. Допустим, это называется some_project
. Я хочу проверить проект на real_directory/
.
$> svn checkout http://svnhost.net/some_project real_directory
A real_directory/index.php
...
A real_directory/robots.txt
Checked out revision 1143.
Я не cd
ввел в этот каталог; Я все еще вне этого, в моем домашнем каталоге:
$> pwd
/ Главная / пользователь
Тем не менее, я все еще могу использовать команды svn для файлов real_directory/
, хотя это не мой текущий рабочий каталог
$> svn status real_directory/
$> touch real_directory/new_file.txt
$> svn status real_directory/
? real_directory/new_file.txt
$> svn add real_directory/new_file.txt
A real_directory/new_file.txt
Я указываю на это, чтобы прояснить неправильные представления, представленные в другом вопросе. Обратите внимание, что я добавил файл в проект, находясь за пределами каталога с управлением версиями. Я могу сделать это из-за существования каталога .svn/
в каталоге real_directory
. Это то, что заставляет real_directory/
содержать проект some_project
subversion, даже если он имеет другое имя.
$> ls real_directory/.svn
all-wcprops entries format prop-base props text-base tmp
(Если вы уже знаете это, пожалуйста, потерпите меня - на мой оригинальный вопрос был хорошо проголосованный ответ, который дал неверную информацию о способности делать это с подрывной деятельностью!)
Это синтаксис команды svn
:
svn [svn-controlled directory] command
Если вы не укажете каталог, svn будет предполагать, что вы говорите о текущем каталоге. Таким образом, все они эквивалентны (текущий рабочий каталог находится в приглашении оболочки):
[ /home/user ]$ svn status real_directory/
A real_directory/new_file.txt
[ /home/user ]$ cd real_directory/
[ /home/user/real_directory ]$ svn status .
A new_file.txt
[ /home/user/real_directory ]$ svn status
A new_file.txt
Итак, подведем итог: я могу делать все, что захочу, , не находясь внутри каталога с управлением версиями, , как если бы я был внутри него , просто указав каталог при выдать мои команды SVN.
Ладно, теперь, когда это в стороне, вот проблема :
Когда я создаю символическую ссылку на управляемый Subversion каталог, svn распознает ее для таких команд, как add
и status
, но не для commit
!
Вот каталог символической ссылки, работающий так же, как настоящий каталог, когда я добавляю файлы и спрашиваю его статус:
$> svn status real_directory/
A real_directory/new_file.txt
$> ln -s real_directory/ symlink
$> svn status symlink
A symlink/new_file.txt
$> svn status real_directory/
A real_directory/new_file.txt
$> touch symlink/another_new_file.txt
$> svn status symlink
? symlink/another_new_file.txt
A symlink/new_file.txt
$> svn add symlink/another_new_file.txt
A symlink/another_new_file.txt
$> svn status symlink/
A symlink/another_new_file.txt
A symlink/new_file.txt
Посмотрите, как symlink/
действует так же, как real_directory/
для целей add
и status
? Проблема: сбой команды коммита:
$> svn commit symlink/ -m "test commit"
svn: '/home/user' is not a working copy
svn: Can't open file '/home/user/.svn/entries': No such file or directory
А? Это странно. Svn наверняка думает, что файл существует, когда я делаю status
и add
! Может быть, он был удален?
$> ls symlink/.svn/entries
symlink/.svn/entries
Нет, все еще там. В ней все еще есть данные?
$> ls -lha !$
ls -lha symlink/.svn/entries
-r--r--r-- 1 user group 14K 2009-12-18 06:36 symlink/.svn/entries
Да, похоже, все в порядке! Хорошо, забудь попытаться зафиксировать каталог по его символической ссылке. А как насчет того, чтобы просто передать каталог его настоящим именем?
$> svn commit real_directory/ -m "test commit"
Adding real_directory/another_new_file.txt
Adding real_directory/new_file.txt
Transmitting file data ..
Committed revision 1144.
Работает нормально. Почему svn работает с add
и status
в символьном каталоге, но не commit
?