我的"真实" .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/*
中的任何文件视为普通文件"。
答案 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
目录移出子模块目录,以便
这是一个简短的例子:
将某些内容(您的"内部存储库")克隆到主存储库的子目录中:
~ $ 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
选项从上游存储库获取更新:
~/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
请注意,您必须从其fake-submodules
目录为内部存储库执行所有Git操作。您可能希望执行git config core.worktree ../../repo/some-other-repo
之类的操作,以避免每次都输入--work-tree
选项。
再次,请重新考虑这样做。 Git的子模块可能并不完美,但至少它们被广泛使用和理解。正如VonC所说,还有其他更合适的选项,如子树。