问题:有时,但不是每次,Git 都会删除存储库的 static
目录。我们不确定是什么触发了它,但它似乎在分支之间 merge 或有时甚至只是检查分支时发生。它会在不询问的情况下执行此操作,并吃掉跟踪的文件。
背景:
- 我有一个(私有(private))项目,它有几个分支、“发布”、“开发”和多个功能线。
- 我们有两个人(我和@stevejalim)在处理这个 repo。这个问题发生在我们俩身上。
- 我的 git 命令纯粹使用命令行;史蒂夫混合使用命令行和 Git Tower。
- 这是一个带有
static
目录的 Django 项目。我们可能在过去的某个时候git rm
编辑了static
目录,或者将它放在.gitignore
中,但不是最近。我们开发分支的负责人在.gitignore
中没有static
并且跟踪了static
中的文件。 - 这种情况很少发生,我们不确定这是我们正在做的事情,还是间歇性问题、Git 错误或损坏的树
- 它可能只有在将另一个分支 merge 回
develop
时才会发生。但是分支总是从develop
分支并返回到develop
。但我们不确定。 我们正在使用 git-flow,但在使用非 git-flow 命令时也会出现此问题。
作为这种情况何时发生的例子:
1) 史蒂夫有一个干净的开发分支(没有更改提交或暂存)并且稳定。他使用
git flow release start|finish
剪切了一个新版本,并且在这个过程中(可能是从 master 到 develop 的反向 merge ),整个/static/树被删除了。2) 史蒂夫通过放弃更改来修复删除(实质上是取消删除文件)。但是随后,Steve 只是从 master 切换回 develop 并且/static/目录再次被破坏(这是 Git Tower 的情况)
3) 有时只是从功能分支 merge 到开发作为临时 merge 可以触发它。尽管
这可能与我们如何修复/static/目录的切换有关吗?批量取消删除已删除内容的最佳方法是什么?丢弃本地更改或硬重置 HEAD 似乎都无法解决问题。 rebase 对我们有帮助吗?
更新 我们刚刚通过 git add .
再次体验了这一点 - 没有更改分支,没有 merge 。这对诊断有帮助吗?
这是 Steve 的 .git/config 的内容:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = git@github.com:foobarbazbam/bar.git
[branch "master"]
remote = origin
merge = refs/heads/master
[gitflow "branch"]
master = master
develop = develop
[gitflow "prefix"]
feature = feature/
release = release/
hotfix = hotfix/
support = support/
versiontag =
[difftool "tower"]
cmd = \"/Applications/Tower.app/Contents/Resources/CompareScripts/kaleidoscope.sh\" \"$LOCAL\" \"$REMOTE\"
这里是.gitignore
的内容:
.DS_Store
*.pyc
*.log
*.log.*
*.bak
*~
settings_local.py
/build/
/static_collected/*
/static/uploads/*
/static/theme_files/*
/static/picture/*
pip-log.txt
*.tmproj
*.dot
*.db
*.sublime-project
*.sublime-workspace
/docs/_*
最佳答案
女士们先生们,我要公开道歉。 Git 不是罪魁祸首。我将把这个问题留在这里作为对其他可能以同样方式通过的人的教训。
我们使用的是 django-storages 后端(一个“插件”,使 Django 能够透明地将文件存储在 Amazon S3 上)。这有一个名为 HashPathStorageTest
的测试。此测试的拆卸删除了 settings.MEDIA_ROOT
,它被设置为 ./static
。在我看来,这是错误的。它没有业务全面删除不是它创建的文件。
在 checkin 之前,我们像好公民一样运行我们的测试。大多数时候我们只为我们的代码运行测试,但偶尔我们为整个项目(包括第 3 方插件)运行测试。这产生了问题中的行为。因为我们同时运行了测试和 git 东西,所以很难确定哪个命令正在执行删除操作(并且删除的文件仅在我们运行 git status
时显示)。
这样问题就解决了。再次抱歉对 Git 的好名声进行诽谤!
关于django - Git 神秘地删除东西(编辑 : actually django-storages),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9158825/