我正在使用 CMake 对我的项目进行核外/源外构建,并希望将“git describe --tags --dirty”的结果作为版本号包含在项目中(仅供参考错误)。但是,任何尝试告诉 git 代码仓库在哪里的尝试都会导致错误,例如“致命:不是 git 存储库(或任何父目录):.git”。
除了当前工作目录之外,有没有办法指定 git 应该在哪里寻找 repo?
您可以git
与--git-dir
-argument 一起使用。
您可以--git-dir
在命令行中指定,或者GIT_DIR
在环境中设置,或者将路径写入名为.git
:的文件中,或者echo gitdir: /path/to/.git > .git
对 repo: 进行软链接ln -s /path/to/.git
。
(最后两个选项可能是最不可取的,这里只是为了完整起见。)
或者您可以使用WORKING_DIRECTORY
-argumentexecute_process()
从 cmake。这就是我所做的:
execute_process(COMMAND "${GIT_EXECUTABLE}" describe --tags --dirty
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
RESULT_VARIABLE res
OUTPUT_VARIABLE out
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
然后我有${out}
.
您可以在命令行上指定 --git-dir
注意:这在 Git 2.21(2019 年 2 月)之前无法完全正常工作:
“ git --work-tree=$there --git-dir=$here describe --dirty
”没有正常工作,因为它没有注意用户错误指定的工作树的位置,已更正。
请参阅Sebastian Staudt ( ) 的commit c801170和commit 2ed5c8e(2019 年 2 月 3 日)。(由Junio C Hamano 合并 -- --在提交 a1e1900中,2019 年 2 月 7 日)koraktor
gitster
describe
: 设置工作树--dirty
NEED_WORK_TREE
我们在运行内置时不使用git-describe
,因为即使在裸存储库中您也应该能够描述提交。但是,该--dirty
标志确实需要一个工作树。由于我们不调用setup_work_tree()
,它使用我们碰巧所在的任何目录。这不太可能与我们的索引匹配,这意味着即使真正的工作树是干净的,我们也会说“脏”。一旦我们
setup_work_tree()
知道用户请求了--dirty
.该
--broken
选项还需要一个工作树。但是因为它的实现调用git-diff-index
我们不必在git-describe
过程中设置工作树。