git add . not adding some subdirectories that are git repos

时间:2015-05-04 19:46:43

标签: git

I used rsync to copy over some important data files to a backup location, and when I try to commit everything, some of the git repos that were copied over aren't being added.

I get the feeling this has to do with git's submodule feature? Is there perhaps a command line switch to tell git to treat all subdirectories as normal folders?

$ 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:   home/user/dev/ruby/vid_downloader (modified content)
#   modified:   home/user/source/htdigest (untracked content)
#   modified:   home/user/source/node (untracked content)
#
no changes added to commit (use "git add" and/or "git commit -a")

$ git add .

$ 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:   home/user/dev/ruby/vid_downloader (modified content)
#   modified:   home/user/source/htdigest (untracked content)
#   modified:   home/user/source/node (untracked content)
#
no changes added to commit (use "git add" and/or "git commit -a")

All those folders that aren't committing are git repos with changes that haven't been committed to their working directories...

This is a part of a backup script, so any kind of cmd line workaround would be appreciated.

4 个答案:

答案 0 :(得分:1)

在每个子模块中尝试 git add -A选项。当使用-A选项时,整个工作树中的所有文件都会更新(旧版本的Git用于限制对当前目录及其子目录的更新)。

尝试 git submodule foreach --recursive git add -A git submodule foreach --recursive git commit -m&#34;一些有意义的消息&#34;

答案 1 :(得分:0)

听起来您的工作流程是:

  1. Rsync将带有子模块的git存储库复制到远程服务器
  2. 在远程服务器上,将复制的git存储库提交到备份git存储库。
  3. 您的第一个选择是,在复制后,删除&#34; .git&#34;每个子模块中的文件夹。这将使git treat成为普通文件夹。由于丢失了子模块的历史记录,我不建议使用此选项。

    如果我理解正确,我认为你应该停止使用rsync并正确使用git本身。

    为git存储库及其子模块设置远程git存储库(请参阅此处:http://thelucid.com/2008/12/02/git-setting-up-a-remote-repository-and-doing-an-initial-push/

    然后在备份脚本调用中

    git push backup_server
    git submodule foreach --recursive git push backup_server
    

    使用

    将backup_server设置为各自的备份存储库
    git remote add backup_server https://backup_server_location/backup_repo.git
    

答案 2 :(得分:0)

Git报告子模块中未提交的更改。 home/user/dev/ruby/vid_downloader中未提交的内容已添加但尚未提交(它仅在索引中列出,而不是在已提交的树中);其他两个中未提交的内容完全没有跟踪。

这很重要,因为子模块的意思是当你将其签出提交的id添加到当前索引(然后提交它)时,你可以稍后通过检查为主项目重新创建特定的,已提交的构建环境。嵌套repo中的特定提交。所以git status默认警告你关于子模块工作树中的任何内容,这些内容不会通过检查当前检出的提交来完全重新创建。

如果htdigestnode子模块中的任何特定未跟踪文件不会影响以后的重建,请将它们添加到子项目的.gitignore中,或者如果您不希望将其名称提交给它.gitignore您可以在其.git/info/exclude中创建一个您不关心的名称的回购本地列表。请参阅gitignore docs

vid_downloader工作树中的修改(和跟踪)文件不是必然问题,但请记住,主项目提交中唯一的事情是提交的ID是应该从嵌套的存储库中检出(这都是子模块) - 但是检查它当前的提交将不会产生现在存在的跟踪内容。在一般情况下,这是非常危险的,你应该非常肯定这不是一个问题(也许它是一个真正不应该提交的文件,或者你使用未经修改的内容进行了测试,并且已经开始了)

那就是说,你确定你的备份脚本还没有复制嵌套的工作树和存储库吗?如果是,则解决方法可能是忽略这些状态消息,因为它们描述了在不同环境中可能的后续检出,而不是现有检查的完全恢复。

答案 3 :(得分:0)

我总是使用

git add --all .

添加所有文件