我有一个这样结构的repo:
/github_folder
|_A
|_B
有两个文件夹:A和B
我只在A文件夹工作。团队的其他人在文件夹b中工作。
我开始工作。我拉一下,修改一下,然后提交,再推一下。一切都很好。这是由在文件夹a中生成新文件的自动过程完成的。
当另一个人在我的自动过程还没有结束的时候,把更改推送到B文件夹的repo,并试图推送时,问题就出现了。它说我有不同于回购的本地更改。
这是git的正常行为。
为了避免这种情况,我尝试使用.git/info/exclude来包含以下内容:
B/
但问题仍然存在。
所以我在做push之前尝试了这个:
git update-index --skip-worktree <FILE>
查找b文件夹中的每个文件
但问题依然存在。
如果我这样做:
git check-ignore <FILE_INSIDE_B>
我得到一个空的响应。
这样做:
git rm --cached <FILE>
不是一个解决方案,因为它将删除repo上的文件。
所以,最大的问题是:
如何保持在repo的文件夹B的内容时做推送?
谢谢!
有些人告诉我,也许一个解决方案是使用2个存储库:一个用于文件夹a,另一个用于B,但这对于在B中工作的人来说并不好,也只需要读取a中的内容。
这仍然是推荐的方法:
- 主存储库,其中声明A和B为子模块,其中A和B是它们自己的存储库,使用
git filter-repo
。 - 每个子模块被设置为跟踪
main
分支 - 可以在
A
下工作,只能推送A
- 你可以读取B,因为父存储库会检出A和B子模块存储库。
如果您想要推送到A/
的修改依赖于B/
的内容(例如:如果您提到的生成文件将B/
中的一些文件作为输入),那么您将需要更新B/
的内容,并重新开始生成
如果你知道你的进程根本不依赖于B/
,那么你可以在推送之前简单地更新B/
部分。
您可以通过与更新的工作合并来做到这一点:
git fetch origin
git merge origin/mainbranch
或者将您的工作重新置于更新后的远程:
git fetch origin
git pull origin/mainbranch
如果您的本地分支设置为跟踪origin/mainbranch
,则第一个相当于git pull
,第二个相当于git pull --rebase
。
您也可以设置git config pull.rebase true
使git pull
始终作为git pull --rebase
。