我正在使用我的master
分支来保留基础资料'用于各种项目的子分支的文件。让我们说我为一家制造货车和下坡滑雪板的公司工作。我的主分支将包含用作这些产品的部件的所有文件。每个产品都来自master
(wagon
分支,ski
分支等。然后使用git rm
删除每个项目不需要的部分(虽然马车上的滑雪板做听起来很有趣)。
问题在于,每当我将master
分支(可能是材料更改)合并到项目分支(例如 wagon )时,git
认为我真的希望更改为我已经忘记了git rm
被遗忘的文件,并将它们添加回来 - 滑雪板的版本大师留在树上,如下面的代码所示。
如何让git
真正 p>
将一些部分添加到master
,并提交:
$ pwd
/tmp/parts
$ git init
Initialized empty Git repository in /tmp/parts/.git/
$ echo rubber > wheels
$ echo steel > skis
$ echo vinyl > seat
$ echo wood > sides
$ ls
seat sides skis wheels
$
$ git add .
$ git commit -a -m 'initial parts'
[master (root-commit) ca7610e] initial parts
4 files changed, 4 insertions(+)
create mode 100644 seat
create mode 100644 sides
create mode 100644 skis
create mode 100644 wheels
创建一个wagon
项目分支,并删除我们在货车上不需要的部分:
$ git checkout -b wagon
Switched to a new branch 'wagon'
$ ls
seat sides skis wheels
$ git rm skis
rm 'skis'
$ git rm seat
rm 'seat'
$ git commit -a -m 'initial wagon design'
[wagon 384b246] initial wagon design
2 files changed, 2 deletions(-)
delete mode 100644 seat
delete mode 100644 skis
工程团队决定更换一些材料。在master
中提交这些更改,以便我们的所有项目都可以使用这些更改:
$ git checkout master
Switched to branch 'master'
$ ls
seat sides skis wheels
$
$ echo 'titanium' > skis
$ echo 'metal' > sides
$ git commit -a -m 'design requirements call for stronger sides and skis'
[master a8bf4c4] design requirements call for stronger sides and skis
2 files changed, 2 insertions(+), 2 deletions(-)
我们需要{em>一些的wagon
项目中的更改,所以合并master
来获取它们,但现在git抱怨了:
$ git checkout wagon
Switched to branch 'wagon'
$ git merge master
CONFLICT (modify/delete): skis deleted in HEAD and modified in master. Version master of skis left in tree.
Automatic merge failed; fix conflicts and then commit the result.
答案 0 :(得分:4)
我认为您可能不会将git用作源控制系统,而更像是解决方案管理器。考虑一下,如果你想在结帐新分支时删除其中的不同部分,为什么要将文件置于源代码管理之下呢?
功能分支是开发路径上的分支,旨在与主服务器合并,并为整个项目带来其他功能。
您可以为每种材料创建一个仓库,然后设置项目构建以从物料回购中获取所需的材料。
答案 1 :(得分:0)
到目前为止,我找到的最可行的解决方案是将master合并到当前分支,然后使用--porcelain
打印出Deleted Updated
个文件列表,然后调用xargs
删除它们:
git status --porcelain | awk '{if ($1=="DU") print $2}'
这不漂亮。将它插入pre-merge
git钩子会很好,但显然不存在。