Почему Subversion переключается на родительский каталог при выполнении коммита - PullRequest
2 голосов
/ 17 февраля 2012

Когда я выполняю svn commit из командной строки unix, он переключается в родительский каталог перед открытием редактора.Это вызывает большую путаницу, когда я совершаю побег из снаряда, поскольку я не там, где я думаю.

В чем причина такого поведения?

(Правка) На снимках экрана ниже показано, что это происходит в самом низком каталоге, а не в самом верхнем *

svn --version svn, version 1.5.5 (r34862)

test: svn checkout file:///export/home/svn/xxx/a
A    a/b
A    a/b/c
A    a/b/c/new
Checked out revision 8882.

test: cd a/b/c
test: pwd
/home/geretz/test/a/b/c
test: echo changed > new
test: svn commit

--This line, and those below, will be ignored--

M    c/new
~
~
:!pwd
/home/geretz/test/a/b

Hit ENTER or type command to continue

прервать сеанс редактирования, попробуйте зафиксировать из каталога верхнего уровня

test: pwd
/home/geretz/test/a/b/c
test: cd ../..
test: pwd
/home/geretz/test/a
test: svn commit

--This line, and those below, will be ignored--

M    b/c/new
~
~
:!pwd
/home/geretz/test/a

Hit ENTER or type command to continue

1 Ответ

4 голосов
/ 23 февраля 2012

Если вы просматриваете svn-источники, вы обнаружите, что svn commit обрабатывается функцией svn_cl__commit в http://svn.apache.org/repos/asf/subversion/branches/1.5.x/subversion/svn/commit-cmd.c. Фактическая функция, которая заботится о разбиении патчей на 'basename' и 'dirname', равна svn_wc_get_actual_target. Эта функция объявлена ​​в http://svn.apache.org/repos/asf/subversion/branches/1.5.x/subversion/include/svn_wc.h и имеет следующий комментарий:

/** Conditionally split @a path into an @a anchor and @a target for the
 * purpose of updating and committing.
 *
 * @a anchor is the directory at which the update or commit editor
 * should be rooted.
 *
 * @a target is the actual subject (relative to the @a anchor) of the
 * update/commit, or "" if the @a anchor itself is the subject.
 *
 * Allocate @a anchor and @a target in @a pool.
 */

И, наконец, в файле http://svn.apache.org/repos/asf/subversion/branches/1.5.x/subversion/libsvn_wc/update_editor.c мы можем увидеть следующий комментарий:

Updates are accomplished by driving an editor, and an editor is
"rooted" on a directory.  So, in order to update a file, we need to
break off the basename of the file, rooting the editor in that
file's parent directory, and then updating only that file, not the
other stuff in its parent directory.

Secondly, we look at the case where we wish to update a directory.
This is typically trivial.  However, one problematic case, exists
when we wish to update a directory that has been removed from the
repository and replaced with a file of the same name.  If we root
our edit at the initial directory, there is no editor mechanism for
deleting that directory and replacing it with a file (this would be
like having an editor now anchored on a file, which is disallowed).

All that remains is to have a function with the knowledge required
to properly decide where to root our editor, and what to act upon
with that now-rooted editor.  Given a path to be updated, this
function should conditionally split that path into an "anchor" and
a "target", where the "anchor" is the directory at which the update
editor is rooted (meaning, editor->open_root() is called with
this directory in mind), and the "target" is the actual intended
subject of the update.

svn_wc_get_actual_target() is that function.

...

As it turns out, commits need to have a similar check in place,
too, specifically for the case where a single directory is being
committed (we have to anchor at that directory's parent in case the
directory itself needs to be modified)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...