
У меня есть рабочая копия svn, в которой я выполнил следующую команду
найти ./source * -type f -exec sed "s/@version 0.5.3/@version 0.5.4/" -i {} \;
все файлы обновлены, но svn не распознает никаких изменений при выполнении одного из них
статус svn ./source
svn diff ./source
svn коммит ./source
Я также пытался написать скрипт, который должен был бы проверять $? из sed и, если все в порядке, «прикасаться» к файлу, чтобы обновить его mdate, но sed, похоже, всегда возвращает 0 -.-
что я могу сделать сейчас? -.-
решение1
Проблема заключается в вашем использовании find
:
find dir1 -type f
Будет соответствовать всем файлам в структуре каталогов, включая те, что находятся внутри .svn
каталогов. Файлы в .svn
— это те, которые используются для выполнения svn diff
против. Таким образом, по сути, вы изменили все копии файлов в дереве, а не только рабочие копии.
Попробуйте следующий синтаксис:
find ./source * -type f ! -path '*/.svn/*' -exec sed "s/@version 0.5.3/@version 0.5.4/" -I {} \;
решение2
В моем случае оказалось, что я обновлял ссылку symlinc на реальный файл. Я использовал sed in-place update. Интересно, что это превращает символическую ссылку в обычный файл. Затем svn был недоволен, потому что тип "object" был изменен, конечно.
Вот как символическая ссылка изменяется на обычный файл:
user@host>ls -l txt*
-rw-rw-r-- 1 user user 90 Feb 28 2020 txtfile
lrwxrwxrwx 1 user user 7 Aug 5 11:07 txtln -> txtfile
user@host>sed -i "s/hello/mello/" txtln
user@host>ls -l txt*
-rw-rw-r-- 1 user user 90 Feb 28 2020 txtfile
-rw-rw-r-- 1 user user 90 Aug 5 11:08 txtln
user@host>