有时,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 命令来实现该目标。所以,实际上,这根本不是什么大问题。
- 以 RCS 的方式复制/移动修改后的文件(在 Emacs 中为
cp FILE FILE.new
、mv FILE FILE.new
或C-x C-w FILE.new
); - 从 RCS 中签出(并锁定)最新版本(
co -l FILE
或在 Emacs 中:C-x C-f FILE
--再次打开它,然后C-x v v
); - 用新的修改覆盖它;
- 提交它(
ci ...
或者在 Emacs 中C-x v v
:)。
(除了这个基本方法之外,实现目标的其他更简单的方法也可能很有趣,即针对这种情况有一个特定的选项。)