假设项目有以下文件夹:
core
src
并拥有分支:master
和testbranch
src
中的{p> master
和src
中的testbranch
包含不同的内容。
我想在合并src
和master
时告诉git 不要合并 testbranch
文件夹。
换句话说,我想只合并分支之间的core
文件夹。
另外,我希望git跟通常文件一样跟踪各个分支的src
文件夹。
有没有可能的解决方案?
答案 0 :(得分:2)
使用.gitignore
文件并在其中包含类似内容:
src/
git add -A
时,Git目录中不会包含任何文件。
有关详情,请参阅git docs。
编辑:您可以使用this SO回答从单个分支中排除文件,我已将其转换为函数:
exclude_file_from_branch() {
git branch "$1"
if [ -f .git/info/exclude_from_"$1" ]; then
echo "$2" >> .git/info/exclude_from_"$1"
else
echo "$2" > .git/info/exclude_from_"$1"
touch .git/info/exclude_from_"$1"
fi
git config core.excludesfile '+info/exclude'
git config "$1".excludesfile '+info/info/exclude_from_"$1"'
}
git config <branchname>.excludesfile '/filepath'
将/filepath
视为额外的.gitignore
文件。该文件中的所有条目必须与.gitignore
文件中的条目一样(例如,目录必须以尾部斜杠directory-example/
结尾)。
然后调用您要忽略的每个文件。目录必须附加斜杠:
cd /git/directory
exclude_file_from_branch "branchname" "/path/to/file"
编辑#2 :刚刚在这里展示,这里是多个文件的重构函数:
exclude_file_from_branch() {
git branch "$1"
[[ -f .git/info/exclude_from_"$1" ]] && touch .git/info/exclude_from_"$1"
for i in "${@:2}"; do
echo "$i" >> .git/info/exclude_from_"$1"
done;
git config core.excludesfile '+info/exclude'
git config "$1".excludesfile '+info/info/exclude_from_"$1"'
}
请致电:
cd /git/directory
exclude_file_from_branch "branchname" "/path/to/file" "/some/ignored/folder/" "/as" "/many" "/as" "/you" "/want"
答案 1 :(得分:1)
根据我的经验,使用单个存储库是不可能的。您可以将git子模块用于主分支。所以你的src
文件夹将作为你的git子模块。并且project
文件夹将作为您的主存储库,它将包含核心以及实际上是git子模块的src文件夹。 (反之亦然)
答案 2 :(得分:0)
这是不可能的
也许您应该将core
和src
拆分为不同的Git存储库,以便单独跟踪它们。
答案 3 :(得分:0)
我认为你知道自己在做什么,熟悉git
概念,并且你被环境(高层管理人员或其他)强迫你这样做。这非常违反git
方式。
那说......
src
中的{p>master
和src
中的testbranch
包含不同的内容。
然后你不应该把它们放在同一个目录里。
制作如下目录结构:
core
src_master
src_testbranch
src --> src_master
src
是指向src_master
或src_testbranch
的符号链接,具体取决于您所在的分支。
现在一切都会好起来的。两个src_...
目录将显示在两个分支中,但您可以忽略它。您仍然可以使用src
。
您是否将src
符号链接放在.gitignore
中取决于您(取决于您实际想要实现的所有内容)取决于您自己。无论哪种方式都无关紧要。
N.B。:您不需要在分支名称之后调用src_...
目录,而是根据实际存在的名称命名它们。您也可以将它们放在其他任何位置,例如dist/...
或vendor/...
。