代码之家  ›  专栏  ›  技术社区  ›  Ton van den Heuvel

Git和C++工作流,如何处理对象和存档文件?

  •  12
  • Ton van den Heuvel  · 技术社区  · 16 年前

    我使用Git与SVN存储库进行接口。我在不同的项目中有几个Git分支。

    现在,每当我使用“git checkout”从一个分支切换到另一个分支时,前一个分支中编译的所有可执行文件和对象文件仍然存在。我想看到的是,从分支A切换到分支B会产生一个树,其中包含我上次处理分支B时的所有对象文件和二进制文件。

    有没有一种方法可以在不创建多个Git存储库的情况下处理这个问题?

    更新: 我理解可执行文件和二进制文件不应该最终出现在存储库中。我有点失望的是Git中所有的分支内容对我来说都是无用的,因为事实证明,我必须为我想要启动的每个分支克隆我的代理Git存储库。我已经为SVN做了一些事情,希望通过Git避免。当然,我不必这样做,但这会导致我在切换分支后大部分时间都在做新的工作(不是很有趣)。

    8 回复  |  直到 14 年前
        1
  •  9
  •   Ryann Graham    16 年前

    你想要的是一个完整的上下文,而不仅仅是分支…哪个是 通常地 超出版本控制工具的范围。最好的方法是使用多个存储库。

    尽管如此,不要担心效率低下……使第二个存储库成为第一个存储库的克隆。Git将自动使用链接以避免在磁盘上有多个副本。

    这是一个黑客给你想要的

    因为您有单独的obj目录,所以可以修改makefiles,使基本位置具有动态性,方法如下:

    OBJBASE = `git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1\//'`
    OBJDIR = "$(OBJBASE).obj"
    # branch master: OBJBASE == "master/", OBJDIR == "master/.obj"
    # non-git checkout: OBJBASE == "", OBJDIR == ".obj"
    

    这将把您的分支名称转换成objbase,您可以使用它来构建实际的objdir位置。我将留给您修改它以适应您的环境,并使它对makefiles的非git用户友好。

        2
  •  6
  •   anon    16 年前

    这不是特定于git或svn的-您应该让编译器和其他工具将中间文件(如.o文件)的输出定向到不受版本控制的目录。

        3
  •  5
  •   Tobu    15 年前

    要保持同一回购的多个签出,可以使用git——工作树。 例如,

    mkdir $BRANCH.d
    GIT_INDEX_FILE=$BRANCH.index git --work-tree $BRANCH.d checkout $BRANCH
    
        4
  •  3
  •   VonC    16 年前

    您可以设置您的IDE编译器在 <output>\branchName\... .

    通过配置编译设置分支,可以在输出目录路径中注册分支的名称。

    这样,即使在您 git checkout 你的新分支项目已经准备好了。

        5
  •  3
  •   adl    16 年前

    contrib/ 目录 git 分发,有一个脚本名为 git-new-workdir 这允许您在不克隆存储库的情况下签出不同目录中的多个分支。

        6
  •  1
  •   greyfade    16 年前

    这些文件不是由Git或Subversion跟踪的,因此它们是单独存在的,前提是它们对您有一定的用处。

    我只是在不同的目录中进行签出。省去了我清理的麻烦。

        7
  •  0
  •   jethro    16 年前

    不需要清除,因为不同分支之间的文件不同,会用实际日期签出!!!!

    这意味着,如果您的makefile是正确的,那么只有那些对象文件、lib和可执行文件会再次编译,因为签出会真正改变这些文件。这正是makefile首先出现的原因。

    例外情况是,如果需要在不同的分支中切换编译器选项甚至编译器。在这种情况下,Git New WorkDir可能是最佳解决方案。

        8
  •  0
  •   masukomi    14 年前

    如果编译的可执行文件是已签入的文件
    然后Git Stash解决了这个问题。

    [compile]
    git stash save "first branch"
    git checkout other_branch
    [Fiddle with your code]
    [compile]
    git stash save "second branch"
    git checkout first_branch
    git stash apply [whatever index your "first branch" stash has]
    # alternatively git stash pop [whatever index...]
    

    如果编译的可执行文件是没有并且不会签入的文件
    然后简单地将它们添加到.gitignore