如何使用Git将仅用于开发的文件与其他文件分开?

dz6r00yl  于 2023-06-28  发布在  Git
关注(0)|答案(4)|浏览(150)

我正在开发一个Lua库,其中包括代码生成和验证等-项目的许多开发代码是用另一种语言编写的。
我想有一个分支库和其他休息的代码。图书馆不应该知道它依赖于什么--首先是为了用户的方便。如果用户阅读文档,他们应该能够找到REST代码--它不是私有的。
分支应同步:为了避免像“在项目中写了一些代码,但它不影响库”这样的错误-忘记更新,为了方便CI,为了清理git历史。
当前项目是master分支根目录下的两个文件夹。我想在不中断同步的情况下分离它们。我能在不使用单独的存储库的情况下实现这一点吗?或者使用单独的回收站适合这里,它的方便?参考文档或具有类似系统的一些项目可能就足够了。
同一个repo的两个分支在这里似乎不合适--有必要同时在两个部分上工作。我不想使用单独的git仓库--那么我需要使用单独的git历史,它们应该是相同的,管理多个仓库似乎很不方便--但我没有看到其他选择。此外,我不知道,如何正确地同步它们,谷歌提供的结果“如何强制回购有相同的内容”-这不是我想要的。
Git with separated development and releases是关于如何在私人开发,然后推到公共-我需要两者并行。其余的似乎与我无关。
在我所知道的方法中,我不喜欢的主要事情是大多数更改都需要多次提交-每个分支/仓库一次。重复(例如完全相同的消息)总是导致错误。可以避免吗?
我看过提问规则,好像,我的问题是开放的,是禁止的。另外,它看起来对其他人没有帮助(问题,答案对像我这样不知道一些git可能性的人很有帮助)。我应该删除这个吗?

ssgvzors

ssgvzors1#

我承认我不知道所有最新的趋势,但直觉上,我会有一个名为集成的分支或类似的分支,并有两个分支-一个用于库开发,另一个用于REST代码,以便他们都可以将更改推到集成分支。如果您有多个开发人员,他们可以从各自的专业库或REST分支。

h79rfbju

h79rfbju2#

您可以将单独的历史记录与主历史记录一起保存在一个存储库中。最简单的是根本不使用git submodule助手,它是一个用于在单独的存储库中处理单独的历史记录的工具包,但是绕过它会弹出一些警告,并且使它们静音的样板也很容易,所以我在这里包含了它。
假设您的支持代码在support中。将support代码拆分成一个合并的子模块的最快方法是,从一个干净的检出:

git branch support $(git commit-tree -m 'Split support code to separate history' @:support)
git rm -r support
git worktree add support
git submodule add support
git config -f .gitmodules submodule.support.url ./
git add .gitmodules
git commit -m 'Split support code to separate history'

分割历史的新克隆将有一个空的support目录,您可以填充它

git submodule init
git worktree add support :support

在较旧和较新结构的提交之间切换的最简单方法是为它们创建单独的工作树,可以使用工作树添加或本地克隆。
如果你的支持代码中有足够的历史记录,你想把整个仓库转换成新的结构,请参阅here,这是我在构建git worktree命令之前编写的。

uxhixvfz

uxhixvfz3#

看看git subtree。它不能满足你所有的需求,但我认为这是一个选择。git subtree似乎已弃用,因为在线docs中找不到其手册。命令git subtree仍然可用,并且可以按照其手册中的描述工作,我们可以通过git subtree --help找到。
让我们假设您当前的仓库有两个文件夹lib/src/,并且它已经有一个现有的分支main
我们可以将main拆分为两个独立的分支,lib_split用于lib/src_split用于src/

git switch main
git branch lib_split $(git subtree -P lib split main)
git branch src_split $(git subtree -P src split main)

现在我们有三个不同的和不相关的分支。在main上,目录结构类似于

.
├── lib
│   └── a.so
└── src
    └── a.lua

lib_split

.
└── a.so

src_slit

.
└── a.lua

此外,我们还可以介绍另一个您可以使用的分支。我们将其命名为main_merge,并从main创建它。

git checkout --orphan main_merge main
git rm -rf lib src
git commit -m'init main_merge' --allow-empty

这个新分支用于组合lib_splitsrc_split

git switch main_merge
# First add the subtrees
git subtree -P lib add lib_split
git subtree -P src add src_split

# If later lib_split and src_split get updated and have new commits,
# we can merge them to main_merge
git subtree -P lib merge lib_split
git subtree -P src merge src_split

如果main被更新,我们也可以更新lib_splitsrc_split

git switch main
revision=$(git subtree -P lib split main)
git switch lib_split
git merge $revision

git switch main
revision=$(git subtree -P src split main)
git switch src_split
git merge $revision

# The following commands would raise an error.
# When using "git subtree split main",
# make sure the current branch is right main.
git switch src_split
git merge $(git subtree -P src split main)
# As "src" does not exist on src_split,
# git subtree split raises an error

您可以在同一个存储库或不同的存储库中维护4个分支,或者前3个分支,或者更多分支。这取决于您的工作流程。

rkttyhzu

rkttyhzu4#

在阅读了答案之后,我得出的结论是,我需要单独的地方(分支)库,这将自动更新到最新的开发分支-正如所指出的,我想要一个单一的提交更新单独的历史。
所以我将使用一些脚本(可能在CI中)。它将为用户生成单独的分支(这就是这个问题出现的原因),我不需要为同步而烦恼--我们当前的工作流根本不会改变(使用CI,没有人需要在本地使用脚本)。
我宁愿避免副本,但子树/子模块(没有其他建议)不会解决我的问题,如果我设法正确理解。他们假设,最终的结果库,依赖于开发文件,将包含开发文件,即使它不是直接的。工作树可以通过使用一个分支用于仅限开发人员的文件和另一个用于仅限库的文件来帮助避免复制,但它的工作更复杂(并且在不影响工作流的情况下解决问题的意外可能性看起来是一个非常重要的好处)。谢谢你的回答,他们帮助我解决了我的问题。

相关问题