我一直在使用Git一段时间。我一直在研究的项目在分支/标签方面并不是太复杂。
我决定在工作中使用git-svn。 SVN存储库有许多不同的分支。很多这些分支机构都是客户定制的主干版本。
我经常在不同的时间为不同的客户解决问题。所以我一直在分支之间来回切换。问题是,每次我在分支之间切换时,为了测试产品,我必须重建项目。构建需要> 2小时(从头开始):(
我假设有一种方法可以在分支customer_a
中存储构建文件,然后检出customer_b
,修改,构建,测试,提交。然后隐藏构建文件并再次检出customer_a
并弹出customer_a
存储以返回到我所在的位置。
仅在跟踪(即添加或提交)构建文件时才有效。我不想跟踪构建文件,我绝对不想检查它们。有没有办法为非跟踪文件存储(或做类似的事情)?还是人们用来达到相同类型的常用做法?
请注意,我们的项目构建方式每个库(其中有数千个)会构建库文件夹本地的文件,即它们不会移动到项目根目录下的构建文件夹。所有构建的文件遍布整个地方。
所以基于一些评论,我认为我需要举例说明我的问题
这是我的文件夹结构。
branch1/
src/
component1/
c1.c
component2/
c2.c
libsrc/
library1/
lib_1.c
library2/
lib_2.c
branch2/
src/
component1/
c1.c
component2/
c2.c
libsrc/
library1/
lib_1.c
library2/
lib_2.c
所以问题在于branch1
和branch2
具有相同的祖先但却分歧了很多。因此,如果我查看branch1
并构建它,我将获得我在Makefile
中链接的二进制文件(例如lib_1.o)以构建最终的组件二进制文件。
如果我然后结帐branch2
对c1.c
进行更改并运行make it尝试链接到branch1
(lib_1.o)创建的二进制文件,因为它们仍然存在在上一个分支中构建的目录中。为了避免这种情况,每次切换分支时都需要进行干净的构建(这需要几个小时)。
答案 0 :(得分:5)
好
所以这个问题暂时没有得到答复,我只是在本地尝试不同的解决方案。
我提出的最好的方法是使用pre amd post checkoout hooks。
这就是我所做的
在存储库的顶层创建一个.binaries
文件夹,并将其添加到.gitignore
文件中。
同时将二进制文件的文件格式添加到.gitignore
文件中。
使用您喜欢的脚本语言编写脚本,以查找所述格式的所有文件,这些文件将它们移动到相同路径结构下的.binaries/<BRANCH>/
文件夹,例如src/library1/lib1.o
应移至.binaries/<BRANCH>/src/library1/lib1.o
- 这应该通过预先结帐来调用
编写脚本将文件从.binaries
文件夹移动到当前分支中,例如.binaries/<BRANCH>/src/library1/lib1.o
应移至src/library1/lib1.o
- 这应该通过结帐后调用
现在,在分支之间切换将恢复为仅在该分支期间构建的二进制文件,并且在创建新分支时您将获得干净的结帐。
答案 1 :(得分:1)
也许我错过了一些明显的东西,但是当切换分支时,Git不会触及未跟踪或忽略的文件,所以如果你在一个分支中构建产品然后切换到另一个分支,那么构建的产品应该保留。
答案 2 :(得分:0)
问题是你需要找回正确的二进制文件:
如果你继续开发2个分支的最新版本,那么最后一点并不是特别重要(如果从那里签出旧标签和分支,则接受重建所有内容)。
但是,如果在构建之后,您会自动将这些“.o”文件发布到用于管理二进制文件的存储库中,这样可以很好地解决您的问题。
例如,本地的Nexus回购是合适的。
答案 3 :(得分:0)
我通常通过将2个克隆的repo创建到2个单独的文件夹(称为customer_a和customer_b)并在一个文件夹中checkout branch1和在另一个文件夹中的branch2来解决这些问题。
答案 4 :(得分:0)
您是否考虑过工作树?
$ git worktree add ../branch2 branch2
这将创建一个工作树结帐到branch2
$ cd ../branch2
$ git branch
* branch2
您只有1个本地仓库,但有2个不同的工作区域,一个用于主仓,另一个用于分支2.
这样你就可以将目标文件分开。