无法跟踪 Git 子模块中的文件
问题:将./shells/smallApps/*
处的文件添加到./.git/
处的Git中,但我没有以下位置的文件./.git/info/exclude
也不在任何 .gitignore
-文件中。
这个问题是基于 这个步骤 问题所在并没有彻底解决。
我运行
$git status ~/bin
# On branch master
nothing to commit (working directory clean)
$git ls-files ~/bin
Screen/dev/vim-open.screen
--- cut ---
我注意到我的 Git 上没有文件“shells/smallApps/*”
$ls shells/smallApps/ ~/bin
devTodo extract
~/bin
我想通过运行将它们添加到我的 Git
$git add shells/smallApps/devTodo shells/smallApps/extract
fatal: Path 'shells/smallApps/devTodo' is in submodule 'shells/smallApps'
$git add .
我注意到由于某种原因这些文件没有添加到我的 Git,因此
$git status ~/bin
# On branch master
nothing to commit (working directory clean)
我不文件位于 .git/info/exclude 或 .gitignore -files 处。
最后一个警告是什么意思?
Problem: to add files at ./shells/smallApps/*
to Git at ./.git/
when I do not have the files at ./.git/info/exclude
nor at any .gitignore
-files.
This question is based on this tread where the problem is not solved completely.
I run
$git status ~/bin
# On branch master
nothing to commit (working directory clean)
$git ls-files ~/bin
Screen/dev/vim-open.screen
--- cut ---
I note that I do not have the files "shells/smallApps/*" at my Git
$ls shells/smallApps/ ~/bin
devTodo extract
~/bin
I want to add them to my Git by running
$git add shells/smallApps/devTodo shells/smallApps/extract
fatal: Path 'shells/smallApps/devTodo' is in submodule 'shells/smallApps'
$git add .
I note that the files are not added to my Git for some reason such that
$git status ~/bin
# On branch master
nothing to commit (working directory clean)
I do not have the files at .git/info/exclude nor at .gitignore -files.
What does the last warning mean?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
更新
Git 忽略文件的一般原因有两个:
gitignore
和子模块
。更具体地说,以下条件将导致 Git 在调用“
git add
”时忽略文件:$GIT_DIR/exclude
匹配。.gitignore
文件(由“git config --global core.excludesfile
”指定)中的模式匹配。在被忽略的文件上强制使用“
git add
”:您可以通过调用“
git add full/path/to/file
”来检查特定文件是否被忽略。手册页指出“如果在命令行上显式指定了被忽略的文件,该命令将失败并显示被忽略文件的列表。”
如果该文件被忽略,您可以强制添加它使用“
git add --force full/path/to/file
”。消除子模块引用的说明:
如之前的答案所述,
shells/smallApps
是 子模块。如果该文件是子模块的一部分,情况会更复杂。 您无法从主项目中修改子模块的内容。
如果您想消除子模块引用并直接跟踪主存储库中的文件,则必须执行几个步骤。 您不能简单地从子模块中删除“.git”目录。 主存储库和子模块之间存在三个链接:
.git/config
中的条目。根据这个相关SO问题,您需要执行以下步骤完全删除子模块:
注意:如果另一个分支依赖于该子模块,那么删除它可能会损坏您的存储库! 这是一个危险的操作...请谨慎使用。
.gitmodules
文件中删除相关行。属于子模块一部分的文件现在未被跟踪,您可以决定根据需要保留或删除它们(带有下面提到的一个警告)。
如果您不需要这些文件,只需删除它们即可。
警告:如果您想保留这些文件(您似乎想要),则必须从子模块文件夹中手动删除
.git
目录:cd path_to_submodule< /code>
rm .git
cd ..
git add path_to_submodule
git status
git commit
>更新:
请求更多信息:
为了帮助调试此问题,请发布以下完整命令会话的输出:
根据您迄今为止所做的描述,我希望看到:
.gitmodules
文件.git
目录(位于存储库的根目录)editors/ 中没有
.git
目录vim/vimdoclet.git
目录UPDATE
There are two general reasons why Git will ignore a file:
gitignore
andsubmodules
.To be more specific, the following conditions will cause Git to ignore a file when '
git add
' is invoked:$GIT_DIR/exclude
..gitignore
file inside the repo..gitignore
file (specified by 'git config --global core.excludesfile
').Forcing '
git add
' on an ignored file:You can check to see if a particular file is ignored by invoking '
git add full/path/to/file
'.The man page states that "If an ignored file is explicitly specified on the command line, the command will fail with a list of ignored files."
If the file is ignored, you can force it to be added with '
git add --force full/path/to/file
'.Instructions to eliminate a submodule reference:
As noted in a previous answer,
shells/smallApps
is a submodule in your repository.If the file is part of a submodule, the situation is more complex. You cannot modify the contents of the submodule from within the main project.
If you want to eliminate the submodule reference and directly track the files in your main repo, there are several steps that must be performed. You cannot simply remove the ".git" directory from the submodule. There are three links between your main repository and the submodule:
.gitmodules
file in your main repo..git/config
of your main repo.Per this related SO question, you need to perform the following steps to completely remove the sub-module:
NOTE: If another branch depends on this submodule, then removing it can corrupt your repository! This is a dangerous operation...use with caution.
.gitmodules
file..git/config
.git rm --cached path_to_submodule
(no trailing slash).The files that were part of the submodule are now untracked and you may decide to keep or delete them as desired (with the one caveat mentioned below).
If you don't need these files, you may simply delete them.
Caveat: If you want to keep these files (which you appear to want), you must manually remove the
.git
directory from the submodule folder:cd path_to_submodule
rm .git
cd ..
git add path_to_submodule
git status
git commit
UPDATE:
Request for further information:
To assist debugging this issue, please post the output of the following complete session of commands:
Based on the description of what you have done so far, I expect to see:
.gitmodules
file anywhere.git
directory (found at the root of your repo).git
directory ineditors/vim/vimdoclet
.git
directory inshells/smallApps
我看到你有
git add
说了一些关于子模块的事情。 你有嵌套的 Git 存储库吗? 这样做:列出了多少个 .git 目录? 如果有多个,那么您就有多个嵌套存储库,这可能是造成某些混乱的原因。
I see you've got
git add
saying something about submodules. Do you have nested Git repositories? Do this:How many
.git
directories are listed? If there is more than one, then you've got multiple nested repositories and that could be a cause of some of this confusion.您应该考虑将此问题发布到 Git 邮件列表 (
[email protected]< /a>
)。 您可能会得到更迅速、更完整的答复。如果您决定在那里发帖,请务必包括: 对
ls -al
cat .git/config
查找 . -名称“.git*”
git 状态
git add 编辑器
git add shell
git 状态
You should consider posting this question to the Git mail list (
[email protected]
). You will likely get a more prompt and complete response.If you do decide to post there, be sure to include:
ls -al
cat .git/config
find . -name ".git*"
git status
git add editors
git add shells
git status