我该如何在远程代码库中删除文件?

19

我不确定这个问题的确切术语是什么。基本上,我需要删除远程存储库中的一些文件和目录。

我有一个本地Git存储库和GitHub上的远程存储库。

  1. 我一直在自己工作。
  2. 一个朋友发起了一个拉取请求。
  3. 我通过GitHub界面合并了他的请求。
  4. 我拉取了更改。
  5. 我测试了代码并决定不采取他的更改(一开始就不应该合并)。
  6. 我回到了之前的提交状态。
  7. 做了一些更改。
  8. 推送到服务器。

这是我本地存储库目前的样子:

*   7e143b1  (HEAD)
|\
| *   18cea0f  (origin/master, origin/HEAD, master)
| |\
| | * fc19ccf
* | | 6f3c58a
|/ /
* | 8d82486
|/
| * d3ce65f  (pre-install-activeadmin)
|/
* 7d0566c
* d1c77ab
* 75ba704
* 30dc67c  (heroku/master)
* f89b1f6
* ea5e2db
* 08931d6
* 9773a6f
* b636aba
* cb6f8d4

我可以将我的本地库更改为7d0566c。 我不确定远程存储库的HEAD指向哪里。

如何删除那些在远程存储库中但不在我的本地存储库中的文件?

显然,因为我将我的HEAD重置为先前的提交,所以我在本地存储库中看不到他的文件。 然而,远程存储库仍然显示他的文件。 当我提交时,它提交得很好。

我的工作流程是错误的吗? 我应该一开始就测试补丁。


你不应该在远程仓库(如Github)上添加或删除文件,因为它是一个裸仓库。通过执行 git rev-parse HEADgit rev-parse origin/master 命令(如果你的远程仓库名为 origin),查看 Github 和本地仓库的 refspecs 是否相同。 - fge
我认为如果您展示git log --pretty="format:%h %d" --graph --all的输出并从那里解释会有所帮助。 - htanata
对的。你不添加/删除文件。咳咳。它们是不同的。我该如何解决这个问题?谢谢。 - dvliman
7e143b1(HEAD) |\
| * 18cea0f(origin/master,origin/HEAD,master) | |\
| | * fc19ccf
  • | | 6f3c58a |/ /
  • | 8d82486 |/
    | * d3ce65f(pre-install-activeadmin) |/
  • 7d0566c
  • d1c77ab
  • 75ba704
  • 30dc67c(heroku/master)
  • f89b1f6
  • ea5e2db
  • 08931d6
  • 9773a6f
  • b636aba
  • cb6f8d4
不确定这会有什么帮助。我可以将本地存储库更改为7d0566c。我不确定远程存储库的头指向哪里。
- dvliman
我对 7e143b1 感到好奇。这是你进行还原的地方吗?如果是,你是如何做到的? - htanata
2个回答

42
从服务器上拉取更改,然后在本地存储库上执行git rm,提交更改并推送到服务器。这些文件将被删除。

有没有一种简单的方法可以从我的本地仓库中删除这些文件?假设有数百个文件?谢谢。 - dvliman
@limaoit:我不是 Git 专家,所以可能有更好的方法,但一个简单的方法是将目录复制到其他地方,从服务器上拉取以使其最新,然后删除存储库中除 .git 之外的所有内容,将备份中除 .git 之外的所有内容移动到您的存储库,提交并推送。 - Ry-
您可以使用Shell来删除文件。这意味着您可以使用Shell脚本、find命令、文件通配符或任何您想要的大量删除技术。完成后,请从顶层目录运行“git add -A .”。-A标志将告诉git注意您已删除的文件。 - wadesworld
我发现你实际上需要使用“git rm”从树和文件系统中删除文件。“rm”单独使用是不够的。 - dvliman
@dvliman 是的,您需要执行 'git rm',但 @wadesworld 的意思是您仍然可以使用命令行完成此操作。例如:git rm junk/*.java 将会删除 junk 目录下所有的 Java 文件。 - Mike Williamson

1

1
我已经完成了。我的本地仓库已成功还原,没有任何问题。远程仓库是导致问题的那个。它包含来自fc19ccf等文件... - dvliman
@limanoit 你只需要将你的更改推送到远程仓库:git push origin master - htanata
@htnata 是的,我已经这样做了。这就是为什么我问这个问题的原因。我的本地repo不包含文件A、B、C。但是我的远程repo包含文件A、B、C,这是之前合并的结果。实际上,我通过重新克隆repo来解决了这个问题。手动删除文件。然后推送提交。这种方法相当hacky。想知道是否有更好的解决方案。 - dvliman
@limanoit 如果你进行了全新的克隆,并像我的回答中所述执行了 git revert ...,然后推送它,你应该会得到与你所做的相同的结果。我认为这就是发生的事情。你使用了 git reset --hard,然后在其上提交了一些更改(步骤7)。你尝试推送,但无法推送。然后你执行了 git pull,它将远程的拉取请求与你的主分支合并。这就解释了为什么你仍然有拉取请求。 - htanata

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接