在 git pull 上保留已删除的文件

问题描述 投票:0回答:2

在我需要拉取的几个提交中,有一些删除。这些文件属于一些基本项目文件,这些文件不应该出现在 git 存储库中(这首先是我们的错误,是的)。 所以我担心删除该文件可能会导致一些故障,我不想花时间修复它。

我正在寻找类似的东西

git rm --cached

从远程存储库中删除文件,但保留在本地

我需要类似的东西

    git pull --cached

这不会删除本地文件,但会将它们从跟踪文件中删除

git git-pull git-rm
2个回答
2
投票

没有简单的方法可以做到这一点 -

git pull
无论如何都会删除已删除的文件。您可以从以前的提交中恢复已删除的文件。提供删除文件的提交是分支中的最后一次提交:

git pull
git checkout @~ -- `git diff --diff-filter=D --name-only @~`
git reset -- `git diff --diff-filter=D --name-only @~`

这将从最后一次提交之前恢复已删除的文件。需要

git reset
从索引(缓存)中删除文件:
git checkout
将它们放在那里。


0
投票

我收到了@phd 关于如何执行此操作的答案的更新。我想我会分享,因为我花了几个小时进行故障排除才能完成我想要完成的任务,这可能对遇到此问题的其他人有所帮助。

我遇到过这样的情况:我需要从远程存储库中删除大量以前跟踪的文件,但希望将这些文件保留在本地,以便任何已经检查过跟踪这些文件的存储库版本的开发人员。更糟糕的是,这些文件位于多个目录、子目录和根目录中的一些单独文件中。 主要问题是删除文件的提交是

不是

对存储库所做的最后一次提交。这是一些提交回来的。 此解决方案允许您使用任何提交来执行相同的操作,因此您不仅限于最后一次提交。这个答案结合了一些博客文章和其他 Stackoverflow 答案

从分支的最新版本中拉取(例如
    git pull origin master
  1. 在从 git 中删除所有文件之前
  2. Git 签出提交
  3. right(例如commit_hash_right_before_files_were_deleted
  4. 获取当前提交中的文件列表与删除所有文件的提交中删除的文件列表之间的差异(例如
  5. git log --diff-filter D --pretty="oneline" --name-only --format= -l 0 commit_hash_right_before_files_were_deleted..commit_hash_where_where_files_were_deleted
  6. 将该列表转换为
  7. sed
     命令以删除空行(例如 
    sed '/^$/d'
     从此处获取:
    https://waylonwalker.com/git-find-deleted-files/#git-reflog-diff-filter )
  8. 将该列表通过管道传输到 Zip 命令,以将所有已删除的文件压缩到 zip 文件中(例如
  9. sed '/^$/d' | zip deleted-files.zip -@ foo
    sed
     命令从输出中删除空白的空行。从这里获取 
    https://superuser.com /a/1228717/1247351
  10. 切换回分支(例如
  11. git checkout master
  12. 解压已删除的文件zip文件(例如
  13. unzip deleted-files.zip
  14. 重置文件列表以将其从本地索引中删除以避免提交它们。
完整代码:

git pull origin master git checkout commit_hash_right_before_files_were_deleted git log --diff-filter D --pretty="oneline" --name-only --format= -l 0 commit_hash_right_before_files_were_deleted..commit_hash_where_files_were_deleted | sed '/^$/d' | zip deleted-files.zip -@ git checkout master unzip deleted-files.zip git reset -- `git diff --diff-filter=D --name-only commit_hash_where_files_were_deleted`
我们传递给 

git log

 命令一些额外的参数。我们传递 
-l 0
 参数以避免 git log 截断返回的已更改文件列表。我们还传递 
--format=
 参数来防止 git log 输出提交哈希和提交消息;我们只关心更改的文件列表。

尝试了一些解决方案,包括尝试使用

git update-index --assume-unchanged

 命令,但是当我尝试从远程分支拉取时,它只会继续删除文件。这是满足我需求的最佳解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.