如何告诉git忽略git子模块?

时间:2014-04-29 11:09:18

标签: git git-submodules

我的"真实" .git文件夹位于/var/www。我想将整个文件夹推送到github。不幸的是,一些git子模块被排除在外。

例如,排除了文件夹w/extensions/Lingo。但w/extensions/Lingo/.git不是"我的" git子模块。 Git仅用于下载w/extensions/Lingo,将用于更新该文件夹。没有自己的发展计划。

我怎样才能告诉我的"真实" git /var/www/.git忽略任何子模块,例如w/extensions/Lingo/.git

换句话说,我想告诉git的是"只需将/var/www/*中的任何文件视为普通文件"。

3 个答案:

答案 0 :(得分:2)

不应忽略

www/extensions/Lingo:您要推送的是gitlink (special entry, mode 16000),它代表(在主要仓库的工作树中)当前在www/extensions/Lingo中检出的SHA1。

您可以通过执行git log(不带斜杠)检查:

cd /var/www
git log -- extensions/Lingo

答案 1 :(得分:2)

如果您坚持在您的回购中包含子模块的内容,您可以执行以下操作:

git submodule deinit Lingo 
git rm -r --cached extensions/Lingo
rm -R extensions/Lingo/.git # (if it is still there)
git add extensions/Lingo

(正如我详细介绍" How do I remove a Git submodule?")

--cached确保您不会删除工作树中该文件夹的内容。

答案 2 :(得分:0)

我不建议这样做,但听起来你已经死了......请注意,这将导致你的"子模块" 两个地方提交,并保持同步将是一个额外的挑战。

我的观点是,这至少和子模块一样复杂,而且因为做其他想要贡献的开发人员可能会感到很困惑。

可以.git目录移出子模块目录,以便

  1. 您的主Git存储库不会查看"子模块"目录作为子模块,和
  2. 你仍然可以从上游获取。
  3. 这是一个简短的例子:

    1. 将某些内容(您的"内部存储库")克隆到主存储库的子目录中:

      ~ $ cd repo
      ~/repo/ $ git clone git://some-other-repo.git/
      
    2. 创建一个目录,将.git目录从内部存储库中保存在主存储库之外的某个位置,并将内部.git目录移动到那里:

      ~/repo/ $ cd ..
      ~ $ mkdir -p fake-submodules/some-other-repo/
      ~ $ mv ~/repo/some-other-repo/.git fake-submodules/some-other-repo/
      
    3. 现在,您可以从主存储库添加所有文件并像往常一样提交:

      ~ $ cd repo
      ~/repo/ $ git add some-other-repo
      ~/repo/ $ git commit -m "Add some other repo"
      
    4. 您可以使用Git' --work-tree选项从上游存储库获取更新:

      ~/repo/ $ cd ../fake-submodules/some-other-repo
      ~/fake-submodules/some-other-repo/ $ git --work-tree ../../repo/some-other-repo status
      ~/fake-submodules/some-other-repo/ $ git --work-tree ../../repo/some-other-repo fetch
      ~/fake-submodules/some-other-repo/ $ git --work-tree ../../repo/some-other-repo merge origin/master
      
    5. 请注意,您必须从其fake-submodules目录为内部存储库执行所有Git操作。您可能希望执行git config core.worktree ../../repo/some-other-repo之类的操作,以避免每次都输入--work-tree选项。

      再次,请重新考虑这样做。 Git的子模块可能并不完美,但至少它们被广泛使用和理解。正如VonC所说,还有其他更合适的选项,如子树。