git - 如何在 visual studio 中设置输出和中间目录以依赖于当前的 git 分支?

标签 git visual-studio compilation git-branch

我正在寻找一个解决方案,以避免在 git 中从一个分支移动到另一个分支时进行大量重新编译。 为不同的分支使用不同的文件夹是解决方案,但它只会在我的工作流程中造成困惑。

我能想到的最佳解决方案是将 git 分支作为项目设置中使用的选项 $ 变量传递,这样我就可以将“输出目录”设置为类似

..\bin\$(branch)\$(Configuration)$(Platform)\

类似于中间目录。

是否可以配置这样的东西?

编辑: 问题是,即使每个分支的输出/中间目录不同(或者在更改分支时从存档中移动),预编译的头文件总是会重新编译,因此项目也会重新编译。

最佳答案

方案一

我认为 OP 使用 $(branch) 的方式很酷。但是在 Visual Studio 中无法使用分支名称的动态值创建用户宏。而如果我们在VS启动后的pre-build事件中加入,Visual Studio是不可能重新加载环境变量的,除非重启。看起来最直接的方法就是在 @ConfusedSushi 提到的 git 存储库中的 post-checkout Hook 中执行此操作。

我刚刚测试了该解决方案,它运行良好。详情如下。

创建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

批处理文件set-branch.bat如下。并将其放入 GIT_DIR/.git/hooks

@echo off

for /f %%i in ('git rev-parse --abbrev-ref HEAD') do setx branch %%i

然后像 OP 那样设置输出目录:

..\bin\$(branch)\$(Configuration)$(Platform)\

现在,每次通过 git check 更改分支时,都会设置一个环境变量 branch。并且您需要重新启动 Visual Studio 以获取环境变量值。它只是按你的需要工作。

解决方案2

由于 OP 的评论,另一种解决方案是让 visual studio 使用相同的文件夹,但在 post-checkout Hook 中移动 Output/intermediate 目录。

只需使用以下脚本创建一个 git hook post-checkout。并且将我在Test/Test/Debug 下的测试文件夹替换为您自己的真实文件夹。可以是绝对目录,也可以是与git仓库相关的目录。构建文件夹如果不是当前分支,将添加分支名作为后缀。

#!/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

[更新] 对于已编辑的问题,由于预编译头在切换分支时总是会发生变化,因此项目总是会重新编译。实际上有一个解决方案,但有点危险

VS 检测源文件的修改时间 来决定是否需要重新编译。所以我们能做的就是改变修改时间来欺骗VS。我们可以使用命令 touch 来完成。

但很难决定哪个时间合适。为了实用,我们可以选择一个不会因为切换分支而改变,而且相对稳定的文件,将预编译头的修改时间设置为与选择的文件相同。我们也可以在 post-checkout Hook 中完成。

touch -r some_stable_chosen_file precompiled_header

但我们应该记住它是不安全的,因为它也可能会忽略对预编译头文件的真正更改。我们必须手动处理它。

关于git - 如何在 visual studio 中设置输出和中间目录以依赖于当前的 git 分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25834054/

相关文章:

git - 如何在差异期间使用 git filter.gitignore.clean 过滤两个分支

git - 错误 : Your local changes to the following files would be overwritten by checkout

.net - 在 Visual Studio 2017 中临时禁用依赖项验证

javascript - 大量编译 HTML 代码?

c - 编译期间共享库版本不匹配?

git - 删除 'changes not staged for commit` 中的文件

git ls-files : howto identify new files (added, 未提交)?

c++ - 如何在 Visual Studio 2003 中创建 64 位 native ATL C++ DLL?

visual-studio - 使用 Typescript,如何打印到 Visual Studio 中的输出窗口?

qt - Qt 5.1 的模块及其相互依赖性?