我正在尝试使用 CMake 作为主要构建工具在 Windows 机器上构建一个简单的应用程序。一旦在项目上调用 CMake,配置阶段就会出现错误:
> cmake -H. -G Ninja -Bbuild -DCMAKE_C_COMPILER:PATH="C:\Program Files\LLVM\bin\clang-cl.exe" -DCMAKE_CXX_COMPILER:PATH="C:\Program Files\LLVM\bin\clang-cl.exe"
-- The C compiler identification is Clang 7.0.0
-- The CXX compiler identification is Clang 7.0.0
-- Check for working C compiler: C:/Program Files/LLVM/bin/clang-cl.exe
-- Check for working C compiler: C:/Program Files/LLVM/bin/clang-cl.exe --broken
CMake Error at C:/Program Files/CMake/share/cmake-3.12/Modules/CMakeTestCCompile
r.cmake:52 (message):
The C compiler
"C:/Program Files/LLVM/bin/clang-cl.exe"
is not able to compile a simple test program.
It fails with the following output:
Change Dir: C:/Users/mak/Desktop/cmake-test/build/CMakeFiles/CMakeTmp
Run …Run Code Online (Sandbox Code Playgroud) 我正在使用一个IDE,它在一些生成但强烈需要的库文件中生成一个版本.因此,如果我想使用具有多个版本的库,或者我看到一些实际上毫无意义的更改,则会出现问题.
总结:我想忽略一个单一的,我认为Git的过滤器是正确的方法一个或多个文件线.我能够在grep没有问题的情况下找到相关的线路,因为人们可能会看到进一步的阅读.
长话短说,我设置了一个git过滤器来恢复对头文件中版本的任何修改.(请注意,此文件中可能有不同的修改.)
[filter "ignore-version"]
smudge = cat %f || cat
clean = git ls-files %f --error-unmatch >&- 2>&- \
&& sed \"/version/c $(git show HEAD:%f | grep version)\" || cat
Run Code Online (Sandbox Code Playgroud)
(为了更好的阅读,我添加了转义换行符并更改了单词以便简单匹配.在原始版本中没有可能的冲突.)
git ls-files检查文件是否已存在于存储库中(当前为HEAD)1.1如果存在,sed将进行脏工作以用已经跟踪的线替换整条线
1.2如果没有,cat除了继续之前什么都不做(这应该确保一个尚未跟踪的文件不会丢失)
到目前为止,它的确有效.(我可以忍受这样一个事实,即过滤器将所有CRLF静默转换为LF ......)
问题:固定文件被git标记为已修改,尽管存储库的最新文件和过滤版本是二进制相等的.我使用kdiff作为单独的工具检查了这个.
编辑1:这是一些输出,显示两个文件版本的相等性:
$ git show HEAD:file.txt | md5sum
9f95c28cebe4f45b8efb7b0ae64dfa56
$ cat file.txt | md5sum
894e7d1b28180b7a193bf3cdd6ceaacb
$ cat file.txt | git ls-files file.txt --error-unmatch …Run Code Online (Sandbox Code Playgroud)