Не удается зафиксировать управляемый svn каталог при обращении через символическую ссылку - PullRequest
1 голос
/ 18 декабря 2009

У меня есть проблема, которую я плохо описываю в другом вопросе. Я публикую это, чтобы прояснить, что я хочу сделать и с какой проблемой я сталкиваюсь. Есть ответ с высоким рейтингом, но на самом деле он не решает мою проблему (короткая история: я не пытаюсь добавить каталог с символическими ссылками в мой проект с управлением версиями).

Если вы уже знаете, как работает 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?

1 Ответ

2 голосов
/ 18 декабря 2009

Я отправил в список рассылки и получил хороший ответ.

Поскольку символическая ссылка на самом деле является файлом файловой системы, то происходит то, что svn думает, что я пытаюсь зафиксировать эту символическую ссылку в виде файла для проекта в текущем каталоге - в основном то, о чем первоначально думал Я хотел сделать!

Что нужно сделать, это

svn commit symbolic_link/*
...