在将一个分支合并到当前分支时,我只希望排除该分支的某些文件,或者只希望合并该分支特定的某些文件。我不想每次合并分支时都指定文件。一个配置文件来跟踪每个分支合并的文件会很棒,类似于下面的文件。
.git-branch-merge
[development-branch]
include:
file2
file3
dir1/
[feature1-branch]
exclude:
file1
dir2
我想知道,由于我尚未找到git
来使用此功能,因此使用它的方式错误吗?
下面是我目前正在处理的仓库的目录结构。它有两个分支,主分支和独立分支。
+ MyRepo_Master
| + CommonDir1
| - CommonFile1
| - CommonFile2
| - PartlyCommonFile3(CMakelists.txt)
-------------------------------------
+ MyRepo_Standalone
| + CommonDir1
| - CommonFile1
| - CommonFile2
| - PartlyCommonFile3(CMakelists.txt)
| - ExclusiveFile1
| - ExclusiveFile2
| @ ExclusiveSubModule1
| @ ExclusiveSubModule2
我可以在两个分支中的任何一个上工作,但根据我正在使用的系统拉一个分支。假设我正在处理Standalone
分支公用文件和部分公用文件。我希望将这些常用文件推送到Master
分支,并希望在推送之前对部分常用文件进行比较和编辑。
一个人可以通过在单独的分支中维护公用文件并使其成为.gitignore
来忽略所有其他分支的独占文件来实现这一目标。但是合并部分通用的文件将是一团糟。
答案 0 :(得分:0)
在git的设计中,目的是提交是整个项目的快照,分支是整个项目的替代行。不支持部分合并,很难做到,如果执行部分合并,可能会导致以后的操作以意外的方式运行。
这并不意味着您不能做其他事情;但这就是您将在该工具中找到良好支持的模型。
当然,在工具不合理地限制您以其想要的工作方式进行工作的情况与尝试使用螺丝起子作为锤子的情况之间,总会有一条很好的界限。因为我不知道您要完成什么,所以我不能说这是怎么回事。也许git是您工作的错误工具,或者也许从根本上来说,有一种更好的方法可以实现最终目标。
更新:公平地说,以上内容不能完全回答您的问题。我想我应该提供一种方法来解决您的要求。提醒我,这不是一个好主意,建议您重新评估项目与git的交互方式,您可以执行以下操作:
您可以创建任何您认为便于处理的格式的数据文件,然后编写脚本。该脚本将显示为.git/MERGE_HEAD
,以弄清楚您要合并的内容(但是请注意,如果您进行了章鱼合并,将有多个条目;处理这种情况要困难得多)。然后,它将使用文件中的数据来确定是否应拒绝每个文件的某些文件
git checkout HEAD -- path/to/the/file
所有路径均已处理
git add .
实际上没有合适的钩子可用来触发此操作,因此在进行--no-commit
时必须始终使用git merge
选项;然后在解决所有合法冲突之后(但在提交之前),您将运行脚本。 (我猜您可以让脚本执行commit
作为其最后一步,但要注意不要意外提交未解决的冲突。)
最终,您得到的通常是“邪恶合并”。它隐藏相对于合并其父项的自然结果的更改,并且可能(a)混淆某些git命令,或者(b)导致您对某些git命令(例如,受影响的分支之间的进一步合并)可能会做出错误的推理。
所以我不会这样做;但是如果您真的想,可以。