git - 从 git azure devops 删除文件及其历史记录?

标签 git azure azure-devops

我已提交敏感密码文件并将其推送到我们的远程存储库 Azure 开发操作中。

但是,现在它只在我的远程分支上。它还没有 merge 到 main 中。我可以以某种方式删除这个文件/甚至是我从 azure dev ops 所做的整个提交吗?

最佳答案

尽快:为了保持理智,我要做的第一件事是复制本地分支,重置为错误提交之前的提交,然后强制推出您的分支。这将最大限度地减少其他人看到您的密码文件的机会,并且您可以随后修复您的分支。以下是您需要的命令(假设错误提交位于名为 my-branch 的分支上:

git checkout my-branch # just in case it isn't checked out already
git status # make sure your status is clean, if not, stash or commit or delete the changes
git branch my-branch-bad # make a copy of it
git reset <commit-id-before-bad-commit> # put branch back to before the bad commit
git push --force-with-lease # push out the branch to AzDev

此时,密码文件在 AzDev 上不再(容易)可用。现在让我们弄清楚如何最好地恢复您的分支(如果需要)。

如果错误的提交是您最近的提交,那么您就可以完成,因为您提到您愿意完全失去该提交。或者,请注意,我故意建议 git reset 而不指定类型,例如 --soft--mixed- -hard,默认为--mixed。这意味着您的所有更改仍将位于您的工作文件夹中。如果您希望重新创建提交,请暂存除密码文件之外的所有待处理文件,然后重做提交。然后你可以推送该提交,你的分支就会像你最初想要的那样。

如果错误的提交不是您最新的提交,并且您在重置到的提交之后还有其他想要保留的提交,则将您的分支重置回之前的位置(通过使用复制的分支),然后交互式 rebase 以删除错误的提交:

git reset --hard my-branch-bad # put branch back to how it was with the bad commit
git rebase -i @{u} # start an interactive rebase from the tip of the remote branch

神秘的@{u}是上游分支的简写,我们知道它目前是错误提交之前的第一个提交,因为这是我们在第一步中最后推出的。当交互式 rebase 出现时,它将显示您推出的内容之后的所有提交,第一个将是您希望删除的提交。您可以将第一行中的 pick 更改为 dropd,甚至可以删除第一行,然后保存并删除退出文件。现在使用 git rebase --continue 继续 rebase 。只要您刚刚删除的第一个提交的其余部分没有后续提交所需的内容,那么您就不会遇到任何冲突,并且 rebase 将继续并完成。您的最终结果是原始分支,除了省略了一个错误的提交。您现在可以推出最新版本的分支。您还可以删除坏分支的副本,因为您不再需要它:gitbranch -D my-branch-bad

现在您的分支已修复,您需要确定密码文件是否仍然可以访问。由于它尚未在任何地方 merge ,我相信答案取决于您是否有您的分支机构尚未设置 PR。如果您的分支上确实有 PR,那么不幸的是,据我所知,PR 历史记录将始终在特定更新中包含该文件。如果分支上没有 PR,那么您可能很安全(足够),不必继续担心它。您(和任何人)可能仍然可以通过直接导航到提交 ID url 来查看 AzDev 中的提交,但是,目前我想不出除了您之外的其他人知道该 ID 的任何理由。但是,在远程分支上存在错误提交期间提取的任何人都将在其存储库的本地副本中拥有该提交的副本,并且如果他们选择查看该文件,则可以看到该文件。

话虽这么说,如果存储库是公开的,我不会冒险,而您最安全的方法是更改​​在该存储库中找到的所有密码文件。如果存储库是私有(private)的,取决于谁可能有权访问该存储库,我至少会更改您不希望组织中的其他人知道的密码。

关于git - 从 git azure devops 删除文件及其历史记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69186424/

相关文章:

python - 用于 Ruby 或 Python 的 Git 库?

git - 如何区分提交与其父提交

c# - 获取 Azure Blob 存储中的图像

azure - 针对具有特定源分支的 master 的拉取请求不会触发 Azure 管道

tfs - VSTS/TFS Build/Release Agent使用哪些端口?

git - 如何在未跟踪的目录上执行 'git status'?

git - 在遵循 john ferguson 的 "gameoflife"项目时,在项目 "jenkins the definitive guide"的初始构建过程中遇到问题

azure - 在 Terraform for Azure 中隐藏 secret 并发出警告

node.js - Azure 存储模拟器出现 Nodejs createQueueService 错误

azure-devops - 添加模板未显示在最新的 Azure DevOps 中