【问题标题】:Recovering from forgetting to .gitignore从遗忘中恢复到 .gitignore
【发布时间】:2010-12-25 14:45:58
【问题描述】:

我被 git 新手似乎很常见的问题所吸引。

我忘了 .gitignore 一个特定的文件,并且在提交后将它添加到 .gitignore 没有任何区别。

我找到了this page on gitready,它解释了如何从存储库中删除文件而不将其从工作树中删除(通过使用命令git rm --cached <file>,它工作正常,除非我尝试将其合并回另一个分支,工作树中的文件被删除。

复制步骤,在一个空文件夹中:

git init
touch want.txt
touch wantnot.txt
git add .
git commit -m "Initial"
git checkout -b BranchForIgnore
git rm --cached wantnot.txt
cat > .gitignore
wantnot.txt  [Ctrl-D Ctrl-D here to exit cat]
git add .
git commit -m "Ignoring file"

到这里为止,一切都很好

git checkout master
git merge BranchForIgnore

此时,我的 wantnot.txt 文件已不在我的 master 中,显然,检查 BranchForIgnore 也无济于事。

怎么办?

【问题讨论】:

    标签: git


    【解决方案1】:

    将文件重命名为临时名称(不使用 git),提交删除加上 .gitignore 文件,然后将文件重命名为原始名称。

    mv wantnot.txt wantnot.txt.tmp
    git rm wantnot.txt
    echo wantnot.txt >.gitignore
    git add .gitignore
    git commit -m "remove mistakenly committed wantnot.txt"
    mv wantnot.txt.tmp wantnot.txt
    

    您为此使用单独的分支可能会不必要地混淆问题。

    【讨论】:

    • 谢谢。实际上我的问题是我已经出于其他原因创建了几个分支,并且我不想在所有分支中都执行此操作(即使我这样做了,我也不太清楚当我执行开始合并这些更改)。
    • 我明白了。您可能需要在所有分支上执行类似的操作(git cherry-pick 可能对此有用)。当您在跟踪和不跟踪wantnot.txt 的分支之间移动时,它可能会出现和消失,直到您对所有分支进行了排序。如果此文件很重要,请确保保存一份副本。
    • 哦,实际文件是 AssemblyInfo.cs,所以在我的工作树中的每个项目中都有一个,不确定 mv 是否适用(我不是 unix 命令行专家,但令人惊讶的是 git是在勾引我)
    • 更糟糕的是,总是有过滤器分支,毕竟这是一个独立的开发者存储库。
    • mv 重命名任何文件,甚至 C# 源文件。 :)
    【解决方案2】:

    我忘了 .gitignore 一个特定的文件,并在提交后将其添加到 .gitignore 没有区别。

    嗯,当然不是。忽略是关于未跟踪文件(这意味着文件不受版本控制)。

    我在 gitready 上找到了一个页面,它解释了如何从存储库中删除文件而不将其从工作树中删除(通过使用命令 git rm --cached <file>,它可以正常工作,除非我随后尝试合并回到另一个分支,工作树中的文件被删除。

    Git 删除文件是因为你可以恢复它,因为它在一个分支中被跟踪。

    解决方案是在所有分支中使用git cherry-pick 提交“取消跟踪”文件(从版本控制中删除文件),或者在单独的提交分支上创建git rm --cached <file> && git commit -a,然后在所有分支中合并此主题分支(然后从跟踪的版本中恢复文件)。

    【讨论】:

    • 谢谢。鉴于许多位置都存在同名文件,我将如何“从跟踪的版本中恢复文件”?
    • 当您切换到缺少给定文件的分支时,您可以使用例如恢复文件git checkout HEAD^ -- <file>,或者在更一般的情况下使用 git log -2 --full-history -- <file> 来获取最后有文件的提交,然后使用 git checkout <commit> -- <file>git show <commit>:<file> > <file> 恢复文件。
    • 哇,这真是个严重的混蛋!
    • 只有当你需要找到最后一个有文件的提交时才需要 git-fu。核心是git checkout <commit that has file> -- <file to be recovered>
    • 显然这只有在我输入文件的确切位置时才有效,我希望有一些可以使用通配符的东西(就像 rm 那样)
    猜你喜欢
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多