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

如何告诉git忽略git子模块?,git,git-submodules,Git,Git Submodules,我的real.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的是,只

我的real.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/*中的任何文件视为普通文件。

www/extensions/Lingo不应被忽略:您将推送的是在主repo的工作树中表示当前在www/extensions/Lingo中签出的SHA1的文件

您可以通过不带尾随斜杠的方式进行检查:

cd /var/www
git log -- extensions/Lingo
www/extensions/Lingo不应被忽略:您将推送的是当前在www/extensions/Lingo中签出的SHA1,它在主回购的工作树中表示

您可以通过不带尾随斜杠的方式进行检查:

cd /var/www
git log -- extensions/Lingo
如果您坚持在回购协议中包含子模块的内容,您可以执行以下操作:

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

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

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

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


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

我不建议这样做,但听起来您好像已经死定了。。。请注意,这将导致子模块中的文件在两个位置提交,保持它们同步将是一个额外的挑战

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

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

您的主Git存储库没有将子模块目录视为子模块,并且 你仍然可以从上游取货。 下面是一个简短的例子:

将内部存储库中的内容克隆到主存储库的子目录中:

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

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

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

请注意,您必须从内部存储库的伪子模块目录执行所有Git操作。您可能希望执行类似git config core.worktree.././repo/其他一些repo的操作,以避免每次都必须键入-worktree选项


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

我不建议这样做,但听起来你已经死定了。。。请注意,这将导致子模块中的文件在两个位置提交,保持它们同步将是一个额外的挑战

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

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

您的主Git存储库没有将子模块目录视为子模块,并且 你仍然可以从上游取货。 下面是一个简短的例子:

将内部存储库中的内容克隆到主存储库的子目录中:

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

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

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

请注意,您必须从内部存储库的伪子模块目录执行所有Git操作。您可能希望执行类似git config core.worktree.././repo/其他一些repo的操作,以避免每次都必须键入-worktree选项


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

我不想忽略它,但要将其视为普通文件夹。如何做到这一点?@adrelanos它是一个子模块:它不应该被视为普通文件夹,而是作为另一个repo内容的标记:一旦你克隆了推送到GitHub的内容,一个简单的git子模块update-init将还原该文件夹的内容。我将它推送到GitHub。当有人克隆它时,他们最终会变得机智

h一个空的/www/w/extensions/Lingo。不是我想要的。@Aderanos是的,这是你可以从子模块中得到的:它不是一个空文件夹,而是一个特殊的图标:它是我在回答中提到的gitlink的标记。@Aderanos记住,这不仅仅是把子模块当作一个普通文件夹来对待:它是关于存储文件夹内容的确切版本。我不想忽略它,但要将其视为普通文件夹。如何做到这一点?@adrelanos它是一个子模块:它不应该被视为普通文件夹,而是作为另一个repo内容的标记:一旦你克隆了推送到GitHub的内容,一个简单的git子模块update-init将还原该文件夹的内容。我将它推送到GitHub。当有人克隆它时,他们最终得到一个空的/www/w/extensions/Lingo。这不是我想要的。@Aderanos是的,这是你可以从子模块中得到的:它不是一个空文件夹,而是一个特殊的图标:它是我在回答中提到的gitlink的标记。@Aderanos请记住,这不仅仅是把子模块当作一个普通文件夹来对待:它是关于存储文件夹内容的确切版本。这可能有用,但是,使用简单的git fetch+git merge origin/master更新extension/Lingo的功能就丢失了。@adrelanos当然,这就是为什么它是一个子模块!最后一种选择是将其设置为子树:当心though@adrelanos其他选择:但我只保留子模块;我觉得在git中杀死子模块触发器是有正当理由的。我刚刚在一个更大的客户端项目的文件夹中添加了一个新的ember.js项目。由于运行“ember new my ember project”在“my ember project”文件夹中创建了一个.git文件夹,因此该项目的主repo希望将其作为子模块获取。它实际上不是一个子模块,但为了方便起见由ember cli生成。为了让父repo将其作为一组文件进行跟踪,上述命令主要是rm-R my ember project/.git部分,这对解决问题非常有帮助。@MySpecialPurpose做得很好:这确实会使该repo的内容可见,而不是嵌套repo的一部分。这可能会起作用,但是,使用简单的git fetch+git merge origin/master更新extension/Lingo的功能就丢失了。@adrelanos当然,这就是为什么它是一个子模块!最后一种选择是将其设置为子树:当心though@adrelanos其他选择:但我只保留子模块;我觉得在git中杀死子模块触发器是有正当理由的。我刚刚在一个更大的客户端项目的文件夹中添加了一个新的ember.js项目。由于运行“ember new my ember project”在“my ember project”文件夹中创建了一个.git文件夹,因此该项目的主repo希望将其作为子模块获取。它实际上不是一个子模块,但为了方便起见由ember cli生成。为了让父repo将其作为一组文件进行跟踪,上面的命令主要是rm-R my ember project/.git部分,这对解决此问题非常有帮助。@MySpecialPurpose做得很好:这确实会使该repo的内容可见,而不是嵌套repo的一部分。