11

问题:有时,但不是每次,Git 都会删除存储库的static目录。我们不确定是什么触发了它,但它似乎发生在分支之间合并或有时甚至只是检出分支时。它无需询问即可执行此操作,并吃掉跟踪的文件。

的背景:

  • 我有一个(私人)项目,它有几个分支,“发布”,“开发”,多个功能线。
  • 我们有两个人(我和@stevejalim)在做这个 repo。这个问题发生在我们俩身上。
  • 我纯粹为我的 git 命令使用命令行;Steve 混合使用了命令行和 Git Tower。
  • 这是一个带有static目录的 Django 项目。我们可能在过去的某个时候git rm编辑过该目录,或者将其放入,但不是最近。并且我们的开发分支的负责人没有进入并且有文件被跟踪。static.gitignorestatic.gitignorestatic
  • 这种情况很少发生,以至于我们不确定这是我们正在做的事情,还是间歇性问题,Git 的错误或损坏的树
  • 只有在另一个分支合并回develop. 但是分支总是develop. develop但我们不确定。
  • 我们正在使用 git-flow,但在使用非 git-flow 命令时也会出现问题。

  • 作为何时会发生这种情况的示例:

    1)史蒂夫有一个干净的开发分支(没有更改提交或阶段)且稳定。他削减了一个新版本,git flow release start|finish并且在这个过程中(可能是从 master 到 development 的反向合并),整个 /static/ 树被删除了。

    2)史蒂夫通过放弃更改来修复删除(基本上取消删除文件)。但是随后,Steve 简单地从 master 切换回了 development,并且 /static/ 目录再次被删除(这是使用 Git Tower)

    3) 有时只是从功能分支合并到作为临时合并进行开发就可以触发它。不过,它似乎确实经常在剪切新版本时发生

这可能与我们如何修复 /static/ 目录的切换有关吗?批量取消删除已删除内容的最佳方法是什么?丢弃本地更改或硬重置 HEAD 似乎都无法解决问题。变基可能对我们有帮助吗?

更新我们刚刚再次体验了这一点git add .- 没有改变分支,没有合并。这对诊断有帮助吗?

这是 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/_*
4

3 回答 3

6

好的女士们先生们,我要公开道歉。Git 不是罪魁祸首。我将把这个问题留给其他可能通过同样方式的人作为教训。

我们使用的是 django-storages 后端(一个“插件”,使 Django 能够透明地在 Amazon S3 上存储文件)。这有一个名为HashPathStorageTest. 此测试删除的拆解settings.MEDIA_ROOT设置为./static. 这是错误的,在我看来。它没有它没有创建的业务一揽子删除文件。

在签入之前,我们像好公民一样运行我们的测试。大部分时间我们只为我们的代码运行测试,但偶尔我们为整个项目(包括 3rd 方插件)运行测试。这正在产生问题中的行为。因为我们一起运行 test 和 git ,所以很难确定哪个命令正在执行删除(并且删除的文件只在我们运行时才出现git status)。

所以问题解决了。再一次,很抱歉对 Git 的好名声进行了诽谤!

于 2012-02-09T16:07:15.770 回答
0

这似乎是 git 决定合并到 A) 删除文件夹 B) 它认为比您要合并到的分支更新的分支。可能有一台具有美国日期类型的机器和一台具有欧洲日期类型的机器吗?或者您的任何测试是否涉及重置机器日期时间?

我会

a) 检查您的开发中包含的所有机器的区域。b)在您的开发中选择一个固定点,将文件复制出来并创建一个新的存储库,然后从那里开始。

于 2012-02-08T11:35:59.953 回答
0

好的,这才发生了-我将其添加为单独的答案,因为它太愚蠢了。我们的 SQL 脚本有一个存储库,一位新开发人员不小心编辑了 .gitignore 以包含 *.sql - 不用说更改已停止在该分支上传播 - 幸运的是,它在开发时间的任何重大损失之前被捕获。然而,这可能会产生上述问题并不是不可想象的——那么你检查过你的 git 指令文件了吗?如果该文件夹被忽略(并且 .gitignore 也在其中 - 即被忽略),它可能会消失并几乎通过魔法重新出现。

于 2012-02-17T09:38:36.373 回答