Git子模块和工作副本是否同时存在?

Git子模块和工作副本是否同时存在?,git,git-submodules,working-copy,Git,Git Submodules,Working Copy,我有Git格式的.dot文件(.zshrc、.bashrc等) 我希望在plugins子目录中有一些额外的repo(也来自我)——我确实有一个用于Emacs配置的定制repo,另一个用于LaTeX配置,等等 将它们创建为子模块有意义吗?我的意思是:我可以把它作为工作副本,直接从子模块编辑我的LaTeX配置吗 还是我在这里混东西?(我希望避免在我的机器上有2个目录,每个子模块repo的内容相同,或几乎相同——我希望我的子模块始终是最新版本,或几乎相同。) 更新 我在/usr/me/.dotfile

我有Git格式的.dot文件(.zshrc、.bashrc等)

我希望在
plugins
子目录中有一些额外的repo(也来自我)——我确实有一个用于Emacs配置的定制repo,另一个用于LaTeX配置,等等

将它们创建为子模块有意义吗?我的意思是:我可以把它作为工作副本,直接从子模块编辑我的LaTeX配置吗

还是我在这里混东西?(我希望避免在我的机器上有2个目录,每个子模块repo的内容相同,或几乎相同——我希望我的子模块始终是最新版本,或几乎相同。)

更新

我在
/usr/me/.dotfiles
中有我的主回购(同时是可编辑的工作副本)

如果我把子模块放在
/usr/me/.dotfiles/plugins
(例如)中,我有一个优势,那就是在克隆时可以同时获取所有其他拼图块,但我知道我不能直接在其中编辑这些文件,对吗?那么,这就是一个问题。。。因为我确实有“任务文件”,例如,当我重新安排工作时,这些文件会被编辑

要正确地编辑这些文件,我必须转到
/usr/me/dev/repo任务文件
。。。一点也不实际

现在,我可以把普通的repo放在
/usr/me/.dotfiles/plugins
中,尽管不是作为子模块。这意味着,在其他机器上,我必须手动(或通过脚本)在同一位置克隆不同的repo,但这不是单行操作(在克隆dotfiles时)

但是,我可以直接在文件所在的位置编辑文件


我的改进问题:上述描述正确吗?有第三条路吗?

更新

将它们创建为子模块有意义吗?我的意思是:我能用吗 这也是一个工作副本,并直接编辑我的乳胶配置从 子模块

是的,子模块被用作独立的存储库。在子模块内提交更改与在repo的另一个本地副本中进行更改完全相同。唯一的区别是,超级回购协议中会有未提交的变更

如果我将子模块放在/usr/me/.dotfiles/plugins(例如)中,那么 将所有其他拼图块集中在一个拼图块上的优势, 克隆时,但我知道我不能直接编辑这些文件 在那里,对吗

您可以像编辑任何其他git存储库一样编辑子模块

现在,我可以把普通的回购放在/usr/me/.dotfiles/plugins中, 虽然不是作为子模块。这意味着,在其他机器上,我必须 手动(或通过脚本)在同一数据库中克隆不同的回购协议 放置,但它不是单行操作(克隆点文件时)

这种方法的问题是“subrepo”中的任何更改都会出现在两个存储库中。子项目的文件夹将被视为超级项目中的另一个跟踪目录

当回购协议看到其子模块发生变化时,它将报告一个修改过的文件:

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
  (commit or discard the untracked or modified content in submodules)

        modified:   plugins/LaTeX (new commits, modified content)
$git状态
论分行行长
未为提交而暂存的更改:
(使用“git add…”更新将提交的内容)
(使用“git签出--…”放弃工作目录中的更改)
(提交或放弃子模块中未跟踪或修改的内容)
修改:插件/乳胶(新提交、修改内容)

原始答案

关于子模块的问题是,您正在将存储库的特定版本绑定到超级项目。如果您继续开发子模块,并做出可能破坏父模块的更改,该怎么办

通过使用子模块,您可以确保始终有一个工作版本

无论如何,您不应该关心在本地拥有多个存储库副本


如果您担心回迁时会浪费带宽,可以在repo中添加一个指向另一个本地副本的远程文件。

那么,您的意思是我可以像编辑任何标准文件/目录一样编辑子模块。在git状态下,子模块与其他repo之间的差异是一行与两行的变化,对吗?额外的问题:您是否有关于如何创建和使用子模块的非常好(简短)的介绍的链接?我发现了非常不同的信息,在我看来,处理这些信息的方法是多种多样的……对git回购协议的每一个更改,如果不是子模块,并且被另一个回购协议跟踪,则必须在这两个地方提交。嵌套repo的每个文件都存储在两个位置。超级repo不会跟踪对文件的更改(不提交),您只会在
status
ing时收到一个通知,说明您在子模块中进行了新的提交或拉入了未提交的内容,您所要做的就是
git添加子模块/路径
将其连接到提交,并提交超级repo。从那时起,克隆将复制更新的子模块。