svn:E000002:提交后无法创建符号链接,svn清理失败,如何恢复?

问题描述 投票:0回答:1

我添加并提交了两个符号链接到有意未提交的文件,它们指向不应该提交给svn的安全凭证。

# svn add submit.cer submit.pkey
A         submit.cer
A         submit.pkey

# svn commit submit.sh submit.cer submit.pkey -m "..."
Sending        submit.sh
Adding         submit.cer
Adding         submit.pkey
Transmitting file data ...
Committed revision 19433.
svn: E200000: Commit succeeded, but other errors follow:
svn: E000002: Error bumping revisions post-commit (details follow):
svn: E000002: Can't create symbolic link '/home/foobar/proj/.svn/tmp/svn-PvrkP3.tmp': No such file or directory

# svn status
svn: E155037: Previous operation has not finished; run 'cleanup' if it was interrupted

# svn cleanup
svn: E000002: Can't create symbolic link '/home/foobar/proj/.svn/tmp/svn-qckOhQ.tmp': No such file or directory

我该如何恢复?

svn symlink
1个回答
0
投票

这可能不是最好的答案,但是我暂时已经解决了我的问题,只需打开引擎盖并弄脏双手即可。这是我所做的:

我试图创建这些丢失的文件,但只要求其他文件:

# svn status
svn: E155037: Previous operation has not finished; run 'cleanup' if it was interrupted
# touch /home/foobar/proj/.svn/tmp/svn-I03qQS.tmp
# svn status
svn: E155037: Previous operation has not finished; run 'cleanup' if it was interrupted
# svn cleanup
svn: E000002: Can't create symbolic link '/home/foobar/proj/.svn/tmp/svn-lYugyl.tmp': No such file or directory
# touch /home/foobar/proj/.svn/tmp/svn-lYugyl.tmp
# svn cleanup
svn: E000002: Can't create symbolic link '/home/foobar/proj/.svn/tmp/svn-3exWGo.tmp': No such file or directory
# touch /home/foobar/proj/.svn/tmp/svn-3exWGo.tmp
# svn cleanup
svn: E000002: Can't create symbolic link '/home/foobar/proj/.svn/tmp/svn-TSibma.tmp': No such file or directory

这是svn的旧版本,2012年的1.7.4版本(r1295709),但我比现在尝试升级要了解得更多。

让我们看看如何使用wc.db

# sqlite3 wc.db .dump |egrep 'submit.(cer|pkey)'
INSERT INTO "NODES" VALUES(1,'submit.cer',0,'',1,'proj/submit.cer',19433,'normal',NULL,NULL,'file',X'2873766E3A7370656369616C2031202A29',NULL,'$sha1$115f82f76a709733e88d9f26a7a5f01a47953401',NULL,19433,1579098137216132,'foobar',NULL,NULL,X'2873766E3A77633A72615F6461763A76657273696F6E2D75726C203337202F69722F73766E2F2173766E2F7665722F31393433332F8888882F7375626D69742E63657229',NULL);
INSERT INTO "NODES" VALUES(1,'submit.pkey',0,'',1,'proj/submit.pkey',19433,'normal',NULL,NULL,'file',X'2873766E3A7370656369616C2031202A29',NULL,'$sha1$99747e06d352668bf515639d0a6ec3dbf86cc1ff',NULL,19433,1579098137216132,'foobar',NULL,NULL,X'2873766E3A77633A72615F6461763A76657273696F6E2D75726C203338202F69722F73766E2F2173766E2F7665722F31393433332F68888882F7375626D69742E706B657929',NULL);

那是什么?

# sqlite3 wc.db '.schema NODES'
CREATE TABLE NODES (
   wc_id  INTEGER NOT NULL REFERENCES WCROOT (id),
   local_relpath  TEXT NOT NULL,
   op_depth INTEGER NOT NULL,
   parent_relpath  TEXT,
   repos_id  INTEGER REFERENCES REPOSITORY (id),
   repos_path  TEXT,
   revision  INTEGER,
   presence  TEXT NOT NULL, 
   moved_here  INTEGER,
   moved_to  TEXT,
   kind  TEXT NOT NULL,
   properties  BLOB,
   depth  TEXT,
   checksum  TEXT REFERENCES PRISTINE (checksum),
   symlink_target  TEXT,
   changed_revision  INTEGER,
   changed_date      INTEGER,
   changed_author    TEXT,
   translated_size  INTEGER,
   last_mod_time  INTEGER,
   dav_cache  BLOB,
   file_external  TEXT,
   PRIMARY KEY (wc_id, local_relpath, op_depth)
);

有趣的地方:symlink_target

sqlite3 wc.db "SELECT symlink_target,NULL,'' FROM NODES WHERE local_relpath = 'submit.cer'"
||

因此,symlink目标为NULL,这很可能是导致它崩溃的原因。不幸的是,我无法在此进行检查:

sqlite3 wc.db "SELECT local_relpath,symlink_target FROM NODES WHERE symlink_target IS NOT NULL"

没有。

所以,如果我只删除这两个NODES怎么办?

# sqlite3 wc.db "CREATE TABLE BADNODES AS SELECT * FROM NODES WHERE local_relpath IN ('submit.cer', 'submit.pkey')"
# sqlite3 wc.db "SELECT * FROM BADNODES"
1|submit.cer|0||1|proj/submit.cer|19433|normal|||file|(svn:special 1 *)||$sha1$a15f82f76a709733e88d9f26a7a5f01a47953401||19433|1579098137216132|foobar|||(svn:wc:ra_dav:version-url 37 /ir/svn/!svn/ver/19433/proj/submit.cer)|
1|submit.pkey|0||1|proj/submit.pkey|19433|normal|||file|(svn:special 1 *)||$sha1$a9747e06d352668bf515639d0a6ec3dbf86cc1ff||19433|1579098137216132|foobar|||(svn:wc:ra_dav:version-url 38 /ir/svn/!svn/ver/19433/proj/submit.pkey)|
# sqlite3 wc.db "DELETE FROM NODES WHERE local_relpath IN ('submit.cer', 'submit.pkey')"
# cd ..
# svn cleanup
svn: E155010: The node '/home/foobar/submit.cer' was not found.

所以它现在仍然有一些关于Submit.cer的内容。但是从哪里来的?不在数据库中。

# sqlite3 wc.db .dump |fgrep submit.cer |fgrep -v BADNODES
# find . -name 'submit.cer'
# fgrep -Rl submit.cer .
./pristine/2a/2a5fe860af1b54b5b63978176e345b2d6cf57e01.svn-base
./wc.db

啊哈,这是原始的东西。但这是一个红色的鲱鱼,这个原始文件只是另一个我提交的文件commit.sh,它的文本中包含了commit.cer,因此svn不会知道。 svn cleanup怎么甚至知道应该有一个名为Submit.cer的东西?

薄雾从此列使用此值获取:

(svn:wc:ra_dav:version-url 38 /ir/svn/!svn/ver/19433/proj/submit.cer)

来自列

dav_cache  BLOB,

具有值:

X'2873766E3A77633A72615F6461763A76657273696F6E2D75726C203337202F69722F73766E2F2173766E2F7665722F31393433332F8888882F7375626D69742E63657229'

因此,我最好搜索所有BLOB列,无论它们是否提到了commit.cer文件。那不是很困难,

# echo "submit.cer" |od -t x1
0000000 73 75 62 6d 69 74 2e 63 65 72 0a
0000013

所以我可以搜索:

# sqlite3 wc.db .dump |fgrep 7375626D69742E636572
INSERT INTO "WORK_QUEUE" VALUES(209,X'2866696C652D636F6D6D6974207375626D69742E636572203120302031203029');
INSERT INTO "BADNODES" VALUES(1,'submit.cer',0,'',1,'proj/submit.cer',19433,'normal',NULL,NULL,'file',X'2873766E3A7370656369616C2031202A29',NULL,'$sha1$115f82f76a709733e88d9f26a7a5f01a47953401',NULL,19433,1579098137216132,'gschadow',NULL,NULL,X'2873766E3A77633A72615F6461763A76657273696F6E2D75726C203337202F69722F73766E2F2173766E2F7665722F31393433332F8888882F7375626D69742E63657229',NULL);

所以我走了,那个WORK_QUEUE!

# sqlite3 wc.db '.schema WORK_QUEUE'
CREATE TABLE WORK_QUEUE (
   id  INTEGER PRIMARY KEY AUTOINCREMENT,
   work  BLOB NOT NULL
);

# sqlite3 wc.db 'select * from WORK_QUEUE'
209|(file-commit submit.cer 1 0 1 0)
210|(file-commit submit.pkey 1 0 1 0)

不错!因此,如果我只是将它们移出WORK_QUEUE?

# sqlite3 wc.db 'CREATE TABLE BAD_WORK_QUEUE AS SELECT * FROM WORK_QUEUE'
# sqlite3 wc.db 'DELETE FROM WORK_QUEUE'

现在是tada!

# cd ..
# svn cleanup
# svn status |fgrep submit
?       submit.cer
?       submit.pkey

这看起来真的很有希望,好像坏链接从未犯过?我们可以尝试吗?糟糕:

# svn update
Updating '.':
   C submit.pkey
   C submit.cer
Updated to revision 19433.
Summary of conflicts:
  Tree conflicts: 2

但是然后,魔术般地:

# svn update
Updating '.':
At revision 19433.

# svn status |fgrep submit
D     C submit.cer
D     C submit.pkey

非常干净!这样我就可以在我的工作中继续生存下去,只是不会再提交这些符号链接。

现在的课程是:在未提交目标的情况下,切勿提交符号链接!

© www.soinside.com 2019 - 2024. All rights reserved.