сделать diff, чтобы игнорировать символическую ссылку - PullRequest
3 голосов
/ 28 марта 2011

Мой проект имеет следующую структуру

/project/config.mk
/project/dir1/config.mk -> ../config.mk
/project/dir2/config.mk -> ../config.mk

Когда я использовал diff для создания файла патча, /project/config.mk был выполнен правильно, но две символические ссылки вызвали некоторые проблемы. Они оба рассматривались как новые файлы, разделы diff были всем содержимым файла config.mk. Я пытался найти параметр diff, чтобы отключить следующую символическую ссылку, но такой опции нет. Любые предложения приветствуются.

По предложению Overbose я создаю этот скрипт. Оно работает. Спасибо всем, что нашли время ответить.

#!/bin/sh -v
ori_dir=$1
new_dir=$2
patch_file=./patch_file
if [ -f ${patch_file} ]
then
        rm ${patch_file}
fi
ori_files=`cd ${ori_dir} ; find ./ -type f ! -type l`
for i in ${ori_files} ; do 
        if [ -f ${ori_dir}/$i ] 
        then
                if [ -f ${new_dir}/$i ]
                then
                        diff -rup ${ori_dir}/$i ${new_dir}/$i >> ${patch_file}
                fi
        fi
done

Ответы [ 4 ]

7 голосов
/ 15 августа 2015

В GNU diff v3.3 теперь есть опция --no-dereference, которая добивается цели

4 голосов
/ 28 марта 2011

Если вы добавляете строки вроде:

dir1/config.mk
dir2/config.mk

в файл .ignore-diff

тогда вы можете выполнить diff(1) так:

diff -ur -X .ignore-diff
1 голос
/ 28 марта 2011

Используйте поиск следующим образом:

find . ! -type l

Эта опция должна пропускать следующие символические ссылки.Используйте эту команду, чтобы найти файл перед запуском diff.

0 голосов
/ 23 мая 2018

Как краткое изложение того, что я попробовал. Рабочим решением было использование --no-dereference для моего случая.

для опции -X вы можете получить справку по этой ссылке: stackoverflow.com: как сделать, что вы используете каталог только для файлов определенного типа

# max diff
diff -ruN ~/xxx-web/ ~/www/xxx/xxx-web/ > ~/xxx-web/20180523-diff.patch
# but may get too much symbolic link following, so in GNU diff v3.3 use :
diff --no-dereference -ruN ~/xxx-web/ ~/www/xxx/xxx-web/ > ~/xxx-web/20180523-diff.patch

## if no options available, you can try a solution that do not seem to work under 3.3 :
# find . -type l > .diffignore
## passing direct file will not work, it require file pattern ?
# diff -ruN -x .diffignore 
## passing with xargs do not seem to work the way below on 3.3 ...
# diff -ruN $(cat .diffignore | xargs -L1 echo "-x ")
# diff -ruN $(cat .diffignore | xargs -i echo "-x '{}'" | sed 's,\./vivaoresto-web/,*,g') \
# inFolder outFolder > diff.patch
# if you wanna apply your path in the source directory :
cd ~/www/xxx/xxx-web/
patch -p1 < ~/xxx-web/20180523-diff.patch
...