Вопрос

Иногда мне приходится работать над кодом, который переводит часы компьютера вперед.В этом случае для некоторых файлов .cpp или .h устанавливается дата их последнего изменения на будущее время.

Позже, когда мои часы будут исправлены, и я скомпилирую свои исходные тексты, система перестроит большую часть проекта, потому что некоторые из последних дат внесения изменений будут в будущем.Каждая последующая перекомпиляция сталкивается с одной и той же проблемой.

Решением, которое я знаю, являются:

a) Найдите файл, в котором указано будущее время, и повторно сохраните его.Этот метод не идеален, поскольку проект очень большой, и даже для расширенного поиска Windows требуется время, чтобы найти измененные файлы.

б) Удалите весь проект целиком и перепроверьте его из svn.

Кто-нибудь знает, как я могу обойти эту проблему?

Возможно, в Visual Studio есть настройка, которая позволит мне указать компилятору использовать бит архива вместо даты последнего изменения для обнаружения изменений в исходном файле?

Или, возможно, существует инструмент рекурсивного сброса даты модификации, который можно использовать в этой ситуации?

Это было полезно?

Решение

Если бы это была моя проблема, я бы поискал способы избежать проблем с системным временем.Изолирование кода в рамках модульных тестов, или виртуальной машины, или чего-то еще.

Однако, потому что я люблю PowerShell:

Get-ChildItem -r . | 
    ? { $_.LastWriteTime -gt ([DateTime]::Now) } | 
    Set-ItemProperty -Name "LastWriteTime" -Value ([DateTime]::Now)

Другие советы

Я бы порекомендовал использовать виртуальную машину, где вы можете возиться с часами сколько душе угодно, и это никак не повлияет на вашу машину разработки.Двумя свободными из них являются Виртуальный КОМПЬЮТЕР от Microsoft и Виртуальный ящик от Солнца.

Я не знаю, работает ли это в вашей ситуации, но как насчет того, чтобы вы не переводили свои часы вперед, а обернули свой метод gettime (или что бы вы ни использовали) и заставили его возвращать нужное вам будущее время?

Установить Утилиты Unix

touch temp
find . -newer temp -exec touch {} ;
rm temp

Обязательно используйте полный путь при вызове find, иначе вместо этого, вероятно, будет использоваться Windows' find.exe.Это не проверено в командной строке Windows - возможно, вам потребуется немного изменить синтаксис.

Я не использую Windows, но наверняка есть что-то вроде awk или grep, которые вы можете использовать, чтобы найти "будущие" файлы с метками времени, а затем "коснуться" их, чтобы у них было нужное время - даже сценарий perl.

1) Используйте систему сборки, которая не использует временные метки для обнаружения изменений, например лепешки

2) Использовать кэширование чтобы ускорить вашу систему сборки, которая использует временные метки (и перестроить все).

В любом случае он использует md5sum для проверки того, что файл был изменен, а не временные метки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top