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

时间:2009-03-17 17:14:49

标签: c++ git workflow

我使用git与SVN存储库连接。我有几个git分支用于我工作的不同项目。

现在,每当我使用'git checkout'从一个分支切换到另一个分支时,来自前一个分支的所有已编译的可执行文件和目标文件仍然存在。我想看到的是,从分支A切换到B会导致一个树,其中包含我上次在分支B上工作时的所有目标文件和二进制文件。

有没有办法在不创建多个git存储库的情况下处理这个问题?

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

8 个答案:

答案 0 :(得分:9)

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

不要担心这种效率低下......让你的第二个存储库成为第一个存储库的克隆。 Git会自动使用链接来避免在磁盘上有多个副本。

这是一个让你想要的黑客

由于您有单独的obj目录,您可以使用以下内容修改Makefile以使基本位置动态化:

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位置。我会留给你修改它以适应你的环境,并使它对你的Makefile的非git用户友好。

答案 1 :(得分:6)

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

答案 2 :(得分:5)

要保留同一个仓库的多个结帐,您可以使用git --work-tree。 例如,

mkdir $BRANCH.d
GIT_INDEX_FILE=$BRANCH.index git --work-tree $BRANCH.d checkout $BRANCH

答案 3 :(得分:3)

您可以将IDE编译器设置为在<output>\branchName\...中生成所有私有临时文件(.class等)。

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

这样,即使私人文件保留在git checkout时,新分支上的项目也准备好了。

答案 4 :(得分:3)

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

答案 5 :(得分:1)

这些文件不会被Git或Subversion跟踪,因此假设它们对您有用,它们就会被单独留下。

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

答案 6 :(得分:0)

不需要make clean,因为不同分支之间不同的文件会被实际日期检出!!!

这意味着如果你的Makefile是正确的,那么只会再次编译那些由于结账而真正改变的对象文件,lib和可执行文件。这就是makefile首先出现的原因。

例外情况是您需要在不同分支中切换编译器选项甚至编译器。在这种情况下,git-new-workdir可能是最好的解决方案。

答案 7 :(得分:0)

如果已编译的可执行文件是已签入的文件
然后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