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.
答案 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)
听起来您的工作流程是:
您的第一个选择是,在复制后,删除&#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默认警告你关于子模块工作树中的任何内容,这些内容不会通过检查当前检出的提交来完全重新创建。
如果htdigest
和node
子模块中的任何特定未跟踪文件不会影响以后的重建,请将它们添加到子项目的.gitignore
中,或者如果您不希望将其名称提交给它.gitignore
您可以在其.git/info/exclude
中创建一个您不关心的名称的回购本地列表。请参阅gitignore docs。
vid_downloader
工作树中的修改(和跟踪)文件不是必然问题,但请记住,主项目提交中唯一的事情是提交的ID是应该从嵌套的存储库中检出(这都是子模块) - 但是检查它当前的提交将不会产生现在存在的跟踪内容。在一般情况下,这是非常危险的,你应该非常肯定这不是一个问题(也许它是一个真正不应该提交的文件,或者你使用未经修改的内容进行了测试,并且已经开始了)
那就是说,你确定你的备份脚本还没有复制嵌套的工作树和存储库吗?如果是,则解决方法可能是忽略这些状态消息,因为它们描述了在不同环境中可能的后续检出,而不是现有检查的完全恢复。
答案 3 :(得分:0)
我总是使用
git add --all .
添加所有文件