如何使 GIT 本地匹配远程(就像刚刚克隆的一样)?
How to make GIT local match remote (as if just cloned)?
我删除了一堆 BitBucket 分支。我希望我的本地人能够反映这一点,而不必手动删除每个分支。我应该可以为 "just make my local match my remote as if I just did a fresh clone."
做些什么
编辑:我不想要一些几个步骤的脚本来 grep 和搜索东西,我也不想只删除我的项目并重新克隆 - 这应该是 GIT 中内置的简单功能。它真的只有 8 个分支,所以我可以手动完成它而不需要太多努力,但我正在尝试在这里学习更好的方法。
edit2:链接的答案之一建议:
git remote prune origin
prunes tracking branches not on the remote.
这看起来像我想要的,但它不会删除任何本地分支。它说修剪了许多 origin/ 分支,但 git branch
仍然显示远程中不存在的所有旧分支。
TL;DR:您真正想要的是 fetch.prune
设置。尽管如此,我还是要回答你提出的问题,而不是你应该回答的问题。 :-)
要将您现有的克隆变成一个看起来像新克隆的东西,您至少需要四个步骤。
运行git fetch -p
。或者,在您的本地存储库或您的每个用户设置中将 fetch.prune
配置为 true
和 运行 git fetch
。这将删除存储库中与分支名称对应的任何 origin/*
远程跟踪名称,这些分支名称曾经但不再存在于 origin
.
的存储库中
手动删除任何您不想要的分支——除了一个。为此,您必须检查您愿意保留的那个。如果您愿意,可以自动执行此删除操作,但请注意,如果您有从未发送到上游的提交,此时您可能会丢失这些提交。见下文。
git reset --hard
你剩余的分支到他们的远程跟踪同行。此时您可能会丢失一些提交。见下文。
运行git clean -dfx
。见下文。
你现在有了一个类似于新克隆的东西,除了这些项目:
您的 HEAD
的引用日志仍然包含您最近的所有 activity,其中可能会保留一些提交。您也可以使用 git reflog expire --expire=all --expire-unreachable=all
.
清除它
您所有的藏品仍然存在。您可以使用 git stash clear
.
将它们全部删除
您所做的任何不寻常的引用仍然存在(例如,refs/notes/
、refs/replace/
来自 git replace
)。如果需要,您必须手动删除它们。
任何浅克隆状态仍然存在。您可以使用 git fetch --unshallow
清除它。
一些假设不变或跳过工作树位可能仍会在索引中设置。您可以使用 git update-index --no-assume-unchanged
和 git update-index --no-skip-worktree
来解决这些问题。如果您更早地 设置 这些位,则只需要这样做; Git 从不自行设置它们。
(我想就这些了,但我可能会遗漏一两个项目。)
备注
如果你要重新做 git clone
,你会:
- 创建一个新的空仓库:
mkdir <em>name</em>; cd <em>名字</em>; git初始化
- 使用适当的 URL 添加一个名为
origin
的遥控器: git remote add origin <em>url</em>
- 运行
git fetch
获取其所有现有分支作为您的 origin/*
远程跟踪名称
- 选择其中一个分支(基于您对
git clone
的 -b
参数)在本地创建
- 运行
git checkout <em>name</em>
,创建 name 来自来源/<em>名称</em>
.
此新存储库具有与第 1 步(p运行ing 提取)后保留的相同远程跟踪名称,因此第 1 步修复了您的远程跟踪名称。它没有分支名称——没有 refs/heads/*
引用——除了在最后一步中创建的分支名称,因此第 2 步删除了这些名称。你当然在剩下的那个分支上,所以第 2 步包括 git 结帐 <em>name</em>
和第 3 步,git reset --hard
, 使您的分支名称指向正确的提交,同时更新您的所有索引和大部分工作树。
当然,未跟踪的文件和目录可能仍然存在,因此第 4 步 git clean -dfx
已 Git 删除它们,包括被 .gitignore
指令忽略的文件。
要自动删除不是当前分支的分支,您需要一个小脚本。链接问题中有一些(可能重复)。但是这些会删除 您的 分支,这些分支 而不是 任何其他人的分支。您不应该随便删除它们:您应该已经自己删除它们当您完成它们时,所以应该没有什么可以删除的。这就是列出第 2 步和第 3 步但不应完成的原因 — 至少不应 自动完成。
最后一个操作,git clean -dfx
,删除构建工件(例如,编译的 *.o
文件或 *.pyc
字节编码的 Python 文件)。通常您想在自己的控制下手动执行此操作,而不仅仅是因为上游发生了某些变化。
我看到了很多好的建议,但看起来真正的答案是 GIT 没有提供比删除项目和使用 GIT 克隆更简单的命令。 IMO 应该有一个命令 git reset --hard
用于所有分支和其他所有 GIT 轨道。
我删除了一堆 BitBucket 分支。我希望我的本地人能够反映这一点,而不必手动删除每个分支。我应该可以为 "just make my local match my remote as if I just did a fresh clone."
做些什么编辑:我不想要一些几个步骤的脚本来 grep 和搜索东西,我也不想只删除我的项目并重新克隆 - 这应该是 GIT 中内置的简单功能。它真的只有 8 个分支,所以我可以手动完成它而不需要太多努力,但我正在尝试在这里学习更好的方法。
edit2:链接的答案之一建议:
git remote prune origin
prunes tracking branches not on the remote.
这看起来像我想要的,但它不会删除任何本地分支。它说修剪了许多 origin/ 分支,但 git branch
仍然显示远程中不存在的所有旧分支。
TL;DR:您真正想要的是 fetch.prune
设置。尽管如此,我还是要回答你提出的问题,而不是你应该回答的问题。 :-)
要将您现有的克隆变成一个看起来像新克隆的东西,您至少需要四个步骤。
运行
git fetch -p
。或者,在您的本地存储库或您的每个用户设置中将fetch.prune
配置为true
和 运行git fetch
。这将删除存储库中与分支名称对应的任何origin/*
远程跟踪名称,这些分支名称曾经但不再存在于origin
. 的存储库中
手动删除任何您不想要的分支——除了一个。为此,您必须检查您愿意保留的那个。如果您愿意,可以自动执行此删除操作,但请注意,如果您有从未发送到上游的提交,此时您可能会丢失这些提交。见下文。
git reset --hard
你剩余的分支到他们的远程跟踪同行。此时您可能会丢失一些提交。见下文。运行
git clean -dfx
。见下文。
你现在有了一个类似于新克隆的东西,除了这些项目:
您的
HEAD
的引用日志仍然包含您最近的所有 activity,其中可能会保留一些提交。您也可以使用git reflog expire --expire=all --expire-unreachable=all
. 清除它
您所有的藏品仍然存在。您可以使用
git stash clear
. 将它们全部删除
您所做的任何不寻常的引用仍然存在(例如,
refs/notes/
、refs/replace/
来自git replace
)。如果需要,您必须手动删除它们。任何浅克隆状态仍然存在。您可以使用
git fetch --unshallow
清除它。一些假设不变或跳过工作树位可能仍会在索引中设置。您可以使用
git update-index --no-assume-unchanged
和git update-index --no-skip-worktree
来解决这些问题。如果您更早地 设置 这些位,则只需要这样做; Git 从不自行设置它们。
(我想就这些了,但我可能会遗漏一两个项目。)
备注
如果你要重新做 git clone
,你会:
- 创建一个新的空仓库:
mkdir <em>name</em>; cd <em>名字</em>; git初始化
- 使用适当的 URL 添加一个名为
origin
的遥控器:git remote add origin <em>url</em>
- 运行
git fetch
获取其所有现有分支作为您的origin/*
远程跟踪名称 - 选择其中一个分支(基于您对
git clone
的-b
参数)在本地创建 - 运行
git checkout <em>name</em>
,创建 name 来自来源/<em>名称</em>
.
此新存储库具有与第 1 步(p运行ing 提取)后保留的相同远程跟踪名称,因此第 1 步修复了您的远程跟踪名称。它没有分支名称——没有 refs/heads/*
引用——除了在最后一步中创建的分支名称,因此第 2 步删除了这些名称。你当然在剩下的那个分支上,所以第 2 步包括 git 结帐 <em>name</em>
和第 3 步,git reset --hard
, 使您的分支名称指向正确的提交,同时更新您的所有索引和大部分工作树。
当然,未跟踪的文件和目录可能仍然存在,因此第 4 步 git clean -dfx
已 Git 删除它们,包括被 .gitignore
指令忽略的文件。
要自动删除不是当前分支的分支,您需要一个小脚本。链接问题中有一些(可能重复)。但是这些会删除 您的 分支,这些分支 而不是 任何其他人的分支。您不应该随便删除它们:您应该已经自己删除它们当您完成它们时,所以应该没有什么可以删除的。这就是列出第 2 步和第 3 步但不应完成的原因 — 至少不应 自动完成。
最后一个操作,git clean -dfx
,删除构建工件(例如,编译的 *.o
文件或 *.pyc
字节编码的 Python 文件)。通常您想在自己的控制下手动执行此操作,而不仅仅是因为上游发生了某些变化。
我看到了很多好的建议,但看起来真正的答案是 GIT 没有提供比删除项目和使用 GIT 克隆更简单的命令。 IMO 应该有一个命令 git reset --hard
用于所有分支和其他所有 GIT 轨道。