Если один и тот же служебный скрипт зарегистрирован в разных каталогах SCM, но везде должен быть одинаковым, как я могу проверить, что они совпадают?

#bash #version-control #find #diff

#bash #контроль версий #Найти #разница

Вопрос:

Признаю, что это не очень хорошая ситуация, но иногда вы обнаруживаете, что одни и те же служебные скрипты (или что-то вроде Makefile них) были зарегистрированы в разных каталогах в одном и том же или разных репозиториях для одного и того же или разных проектов. Возможно, они даже были зарегистрированы в каталогах с несогласованными именами или каталогах проекта, находящихся на разных уровнях исходного дерева.

Как я могу найти файлы с одинаковым именем и (возможно) одинаковым назначением, которые находятся в разных каталогах, и легко определить, какие из них одинаковые, какие разные и в чем различия?

Ответ №1:

Для Makefile примера предположим, что кто-то работает в одиночку над новым и улучшенным вариантом ProjectX и обновил Makefile для автоматизации ранее выполнявшейся вручную задачи. Вы несете ответственность за то, чтобы остальные старые проекты соответствовали требованиям, но кто-то, возможно, уже выполнил некоторые обновления.

Вы могли бы использовать приведенный ниже скрипт для запуска diffTree.sh Makefile и получения следующего вывода:

 bash$ diffTree.sh Makefile
diff ./newprojects/projectX/Makefile ./projectB/Makefile
1,2d0
< CONFIGPARAM = "foo"
17c5
<       echo "I did that thing for you"
---
>       echo "You should do that thing"
diff ./projectB/Makefile ./projectC/Makefile
diff ./projectC/Makefile ./projectD/Makefile
end of files
bash$ _
  

Это говорит о том, что ProjectB и C и D все идентичны, но newprojects / ProjectX / Makefile отличается от B, и, следовательно, также одинаково отличается от C и D.

Если все файлы в разных местах с одинаковыми именами одинаковы, вы получите что-то вроде этого:

 bash$ diffTree.sh sameFile.h
diff ./newprojects/projectX/src/headers/sameFile.h ./projectB/src/headers/sameFile.h
diff ./projectB/src/headers/sameFile.h ./projectC/src/headers/sameFile.h
diff ./projectC/src/headers/sameFile.h ./projectD/src/headers/sameFile.h
end of files
bash$ _
  

Если вы укажете имя файла, которого вообще не существует в дереве, вы получите:

 bash$ diffTree.sh foo
end of files
bash$ _
  

Вот скрипт:

 #!/usr/bin/env bash
set `find . -name $1 -print ; echo no files`
while [[ $# -gt 1 ]]
  do 
    if [[ $2 = no amp;amp; $3 = files ]]
      then 
        shift
      else 
        echo diff $1 $2
        diff $1 $2
      fi
    shift
  done
echo end of files
  

Похоже, что он обрабатывает подстановочные знаки в имени файла, но, вероятно, нужно что-то сделать, чтобы сделать это безопаснее. Аналогично, было бы улучшением разрешить параметры различий, такие как «игнорировать пробелы» и так далее.

Очевидно, что это полностью прерывается, если у вас есть файл с именем ‘no’, а второй файл с именем ‘files’ появляется в середине вывода команды ‘find’, но поскольку все имена файлов имеют префикс ‘./’, а ‘no’ следует после ‘files’ в алфавитном порядке, я думаю, что это достаточно безопасно.