我使用rsync将一些重要的数据文件复制到备份位置,当我尝试提交所有内容时,一些复制过来的git repos不会被添加。
我感觉这和git的子模块特性有关?是否有命令行开关来告诉git将所有子目录视为普通文件夹?
$ 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")所有那些没有提交的文件夹都是git repos,带有尚未提交到其工作目录的更改……
这是备份脚本的一部分,因此任何类型的cmd线路解决方案都将不胜感激。
发布于 2015-05-05 04:11:23
在每个子模块中尝试git add -A选项。当使用-A选项时,整个工作树中的所有文件都将被更新(旧版本的Git用于限制对当前目录及其子目录的更新)。
或
尝试使用递归git子模块foreach --递归git添加-A和git子模块foreach --递归git提交-m“”消息。
发布于 2015-05-05 06:04:31
听起来你的工作流程是:
第一个选项是,在复制时,删除每个子模块中的".git“文件夹。这将使git视为一个普通的文件夹。由于丢失了子模块的历史记录,我不建议使用此选项。
如果我没理解错的话,我认为你应该停止使用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发布于 2015-05-05 06:40:19
Git正在报告子模块中未提交的更改。home/user/dev/ruby/vid_downloader中未提交的内容已添加,但尚未提交(它只在索引中列出,而不在已提交的树中);其他两个中的未提交内容完全未被跟踪。
这很重要,因为子模块的意义在于,当您将其签出提交的id添加到当前索引(然后提交)时,您可以稍后通过从嵌套的代码库中签出特定的提交来为主项目重新创建特定的、已提交的构建环境。因此,默认情况下,git status会警告您子模块工作树中的任何内容,这些内容不会通过签出其当前签出的提交来准确地重新创建。
如果您的htdigest和node子模块中任何特定的未跟踪文件不会影响以后的重建,可以将它们添加到子项目的.gitignore中,或者如果您不希望将它们的名称提交到它的.gitignore中,您可以在它的.git/info/exclude中创建一个您不关心的名称的本地存储库列表。请参阅gitignore docs。
vid_downloader工作树中修改的(和跟踪的)文件不一定是问题,但请记住,主项目提交中唯一的内容是应该从嵌套的存储库(子模块就是这样)签出的提交的id --但是签出它的当前提交不会生成现在的跟踪内容。这在一般情况下是非常危险的,您应该非常确定这不是一个问题(可能它是一个确实不应该提交的文件,或者您使用未更改的内容进行了测试,然后继续进行测试)。
也就是说,您确定备份脚本不会同时复制嵌套的工作树和存储库吗?如果是,解决方法可能是忽略这些状态消息,因为它们描述的是稍后在不同环境中的潜在签出,而不是现有环境的完全恢复。
https://stackoverflow.com/questions/30038708
复制相似问题