我使用git与SVN存储库连接。我有几个git分支用于我工作的不同项目。
现在,每当我使用'git checkout'从一个分支切换到另一个分支时,来自前一个分支的所有已编译的可执行文件和目标文件仍然存在。我想看到的是,从分支A切换到B会导致一个树,其中包含我上次在分支B上工作时的所有目标文件和二进制文件。
有没有办法在不创建多个git存储库的情况下处理这个问题?
更新:我知道可执行文件和二进制文件不应该最终存储在存储库中。我有点失望的事实是git中的所有分支内容对我来说都是无用的,因为事实证明我必须为我想要启动的每个分支克隆我的代理git存储库。我已经为SVN做了一些事情,希望用git来避免。当然,我不必这样做,但这会导致我在分支之间切换后大部分时间做一个新的制作(不好玩)。
答案 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