kov*_*rex 3 git compilation visual-studio git-branch
我正在寻找一个解决方案,以避免在git中从分支移动到分支时进行大量重新编译.为不同的分支使用不同的文件夹是解决方案,但它只是在我的工作流程中创建了混乱.
我能想到的最好的解决方案是将git分支作为项目设置中使用的选项$变量传递,因此我可以将"输出目录"设置为类似
..\bin\$(branch)\$(Configuration)$(Platform)\
Run Code Online (Sandbox Code Playgroud)
与中间目录类似.
这样的事情可以配置吗?
编辑:问题是,即使每个分支的输出/中间目录不同(或在更改分支时从存档移动),仍然会重新编译预编译的头文件,因此项目也会重新编译.
我认为OP的使用$(branch)方式很酷.但是无法使用分支名称的动态值创建用户宏Visual Studio.Visual Studio如果我们pre-build在VS启动后在事件中添加环境变量,则要么重新加载环境变量要么是不可能的,除非它重新启动.看起来最简单的方法就是如上所述post-checkout在git存储库中挂钩@ConfusedSushi.
我刚刚测试了解决方案,效果很好.详情如下所示.
创建git hook post-checkout(文件名只是post-checkout,并将其放入GIT_DIR/.git/hooks.它将调用批处理文件set-branch.bat.
#!/bin/bash
if [ "$3" -eq "1" ]; then
cmd.exe /c "`pwd`/.git/hooks/set-branch.bat"
fi
Run Code Online (Sandbox Code Playgroud)
批处理文件set-branch.bat如下.并把它放进去GIT_DIR/.git/hooks.
@echo off
for /f %%i in ('git rev-parse --abbrev-ref HEAD') do setx branch %%i
Run Code Online (Sandbox Code Playgroud)
然后设置Output directory为OP做了:
..\bin\$(branch)\$(Configuration)$(Platform)\
Run Code Online (Sandbox Code Playgroud)
现在,每次更改分支时git check,branch都会设置一个环境变量.您需要重新启动Visual Studio才能获得环境变量值.它只是按你的需要工作.
由于OP的评论,另一个解决方案是让visual studio使用相同的文件夹,但在post-checkout钩子中移动Output/intermediate目录.
只需post-checkout使用以下脚本创建一个git hook .并使用您自己的真实文件夹替换下面的测试文件Test/Test/Debug夹.它可以是绝对目录或与git存储库相关.如果构建文件夹branch name不是当前分支,则它将作为后缀添加.
#!/bin/bash
build_folder=Test/Test/Debug
if [ "$3" -eq "1" ]; then
oldref=$(git reflog | awk 'NR==1{ print $6; exit }')
newref=$(git rev-parse --abbrev-ref HEAD)
if [ "$oldref" != "$newref" ]; then
if [ -d "$build_folder-$oldref" ]; then
rm -rf "$build_folder-$oldref"
echo "Deleted $build_folder-$oldref"
fi
if [ -d "$build_folder" ]; then
mv "$build_folder" "$build_folder-$oldref"
echo "Moved $build_folder to $build_folder-$oldref"
fi
if [ -d "$build_folder-$newref" ]; then
mv "$build_folder-$newref" "$build_folder"
echo "Moved $build_folder-$newref to $build_folder"
fi
fi
fi
Run Code Online (Sandbox Code Playgroud)
[已更新]对于已编辑的问题,由于预编译的标题在切换分支时总是会更改,因此始终会重新编译项目.实际上有一个解决方案,但有点危险.
VS检测modified time源文件以确定是否需要重新编译.所以我们能做的就是改变modified time作弊VS.我们可以用命令来做touch.
但很难确定哪个时间合适.为了使其实用,我们可以选择一个不通过切换分支而变化的文件,并且也相对稳定,并将modified time预编译头文件设置为与所选文件相同.我们也可以在post-checkout钩子里做.
touch -r some_stable_chosen_file precompiled_header
Run Code Online (Sandbox Code Playgroud)
但我们应该记住它不安全,因为它也可能忽略对预编译头文件的真正更改.我们必须手动处理它.
| 归档时间: |
|
| 查看次数: |
769 次 |
| 最近记录: |