如果修改后的文件没有事先被 RCS 锁定(并且我使用的是 Emacs VC 模式),如何提交修改的文件?

如果修改后的文件没有事先被 RCS 锁定(并且我使用的是 Emacs VC 模式),如何提交修改的文件?

有时,RCS 控制下的文件在未锁定的情况下会被修改(= 由我检出修改)。

(在这些情况下,它实际上被 RCS 设置为只读以防止此类修改;但它可能是 /etc/ 下的一个配置文件,因为我正在升级软件包而被修改。)

然后通常我还是想提交新的修改,就好像在修改之前已签出最后一个修订版一样。

那么最好如何进行呢?

我通常使用Emacs VC,并执行C-x v v签出和签入操作。但是如果文件没有事先签出,则此操作会失败。有没有办法专门从 Emacs 内部进行?但也欢迎使用 shell 命令进行回答。

答案1

实际上要简单得多。您可以将rcs -l其锁定,然后尝试重新签入。

我假设你问这个问题时的情况是这样的:

$ echo v1 >foo
$ ci -u -t-"Test file." foo
$ chmod u+w foo
$ echo v2 >foo

此时, 和ci都会co失败:

$ co -l foo
foo,v  -->  foo
revision 1.1 (locked)
writable foo exists; remove it? [ny](n): 

$ ci -u foo
foo,v  <--  foo
ci: foo,v: no lock set by username

您可以通过以下方式锁定文件并提交更改:

$ rcs -l foo
RCS file: foo,v
1.1 locked
done
$ ci -u -m"Second revision." foo
foo,v  <--  foo
new revision: 1.2; previous revision: 1.1
done

答案2

Emacs 手册 (info) 的 VC 部分提到了一种特殊的 RCS 操作模式,可以作为解决此类问题的一个选项:

32.1.12.2 RCS 和 SCCS 选项

默认情况下,RCS 使用锁定来协调多个用户的活动,但有一种称为“非严格锁定”的模式,您可以在不先锁定文件的情况下签入更改。使用rcs -U切换到非严格锁定对于特定文件,请参阅rcs 手册页了解详细信息。

但是,当然,人们可能不想切换到非严格模式。

答案3

可以使用基本的 Unix 命令来实现该目标。所以,实际上,这根本不是什么大问题。

  1. 以 RCS 的方式复制/移动修改后的文件(在 Emacs 中为cp FILE FILE.newmv FILE FILE.newC-x C-w FILE.new);
  2. 从 RCS 中签出(并锁定)最新版本(co -l FILE或在 Emacs 中:C-x C-f FILE--再次打开它,然后C-x v v);
  3. 用新的修改覆盖它;
  4. 提交它(ci ...或者在 Emacs 中C-x v v:)。

(除了这个基本方法之外,实现目标的其他更简单的方法也可能很有趣,即针对这种情况有一个特定的选项。)

相关内容