Я говорил с людьми из TMate Software, и, похоже, это действительно возможно. Как они объяснили это, да, вы можете использовать локальный файл и генерировать контрольные суммы с новым контентом и отправлять его в Subversion, но (если что-то) это только поможет Subversion проверить, что у вас есть правильная и последняя версия в вашей локальной копии , В конце концов, Subversion все равно будет делать свои собственные различия и дельты.
Так что, если у вас нет локальной копии, вы можете просто создать контрольную сумму, как если бы файл был новым. Вот грубый код, извлеченный из моего более крупного проекта. Обратите внимание, что проверка SVNDirEntry
заранее не требуется, если вы уже знаете, существует ли файл; Я даю это здесь для пояснения.
SVNDirEntry dirEntry = svnRepository.info(filePath, -1);
ISVNEditor editor = svnRepository.getCommitEditor("example modification", null, true, null);
editor.openRoot(-1);
if(dirEntry.getKind() == SVNNodeKind.NONE)
{
editor.addFile(filePath, null, -1);
}
else
{
editor.openFile(filePath, -1);
}
editor.applyTextDelta(filePath, null);
final SVNDeltaGenerator deltaGenerator = new SVNDeltaGenerator();
final String checksum = deltaGenerator.sendDelta(filePath, inputStream, editor, true);
editor.closeFile(filePath, checksum);
editor.closeDir(); //close the root
editor.closeEdit();
Не забудьте после получения редактора коммитов обернуть все до closeEdit()
в блок try...catch
, чтобы вы могли отменить редактирование, если что-то пойдет не так.
Я пробовал это, и он проходит все мои тесты, используя SVNKIt 1.3.7 (например, от Maven):
<repositories>
<repository>
<id>svnkit-repository</id>
<name>SVNKit Repository</name>
<url>http://maven.tmatesoft.com/content/repositories/releases/</url>
</repository>
</repositories>
...
<dependency>
<groupId>org.tmatesoft.svnkit</groupId>
<artifactId>svnkit</artifactId>
<version>1.3.7</version>
</dependency>