git 裸仓库:在 --mirror 之后提交的删除与删除除 .git 以外的所有内容后未准备提交的删除

git bare repo: deletions commited after --mirror vs deletions not staged for commit after deleting all except .git

最终我想要一个干净的方法来 return 压缩(例如裸)repo 准备好被签出(好的,对于迂腐的:在额外的 core.bare false 之后)到任何分支.我已阅读 How to convert a normal Git repository to a bare one? 的热门答案。如评论中所述,使用 clone 会丢失配置条目,以下是尝试使用接受的答案后出现的问题。也许对此有一个简单的微不足道的修复,这就是为什么我在评论中找不到它的原因。

TL;DR

我正在尝试理解与裸 git 回购相关的信息。

  1. 克隆所有分支: How to clone all remote branches in Git?:

已执行且有效:

git clone --mirror https://github.com/vmatare/thinkfan.git path/to/dest/.git
cd path/to/dest
git config --bool core.bare false
git checkout master # checkout devel also works with freshly cloned repo

Man git-clone:

   --mirror
       Set up a mirror of the source repository. This implies --bare.
       Compared to --bare, --mirror not only maps local branches of the
       source to local branches of the target, it maps all refs (including
       remote-tracking branches, notes etc.) and sets up a refspec
       configuration such that all these refs are overwritten by a git
       remote update in the target repository.

git checkout anybranch 之前,我只有 .git 个文件夹并且:

$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    deleted:    .github/workflows/ccpp.yml
    deleted:    CMakeLists.txt
    deleted:    COPYING
    deleted:    README.md
    ...

“已删除”输出为绿色。即删除在索引中并准备好提交(根据输出并在 https://unix.stackexchange.com/questions/458354/git-status-coloring-deleted-files 中解释)。

  1. 要转换为裸:

已执行:

cd repo
mv .git ../repo.git # renaming just for clarity
cd ..
rm -fr repo
cd repo.git
git config --bool core.bare true

即删除除 .git 之外的所有内容,并将 core.bare 配置值更改为 true
之后

git config --bool core.bare false

顺便说一句是

git config --bool core.bare true
git config --bool core.bare false

什么都没有或某些内部状态发生了变化?无论如何,同时执行这两项操作意味着我按照投票接受的答案进行裸回购。做 clone --mirror 我也做了裸回购。但现在“已删除”为红色,输出为“更改未暂存提交”:

git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    deleted:    .github/workflows/ccpp.yml
    deleted:    CMakeLists.txt
    deleted:    COPYING
    deleted:    README.md
    ...
    no changes added to commit (use "git add" and/or "git commit -a")

为什么最初克隆的 repo 与再次转换为 bare 之间存在这样的差异?

我已经尝试阅读对 make bare repo 答案的评论,但没有注意到提及该问题。

如果我现在做 git add *,那么显然状态变得与我刚刚用 --mirror:

克隆时相同
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    deleted:    .github/workflows/ccpp.yml
    deleted:    CMakeLists.txt
    deleted:    COPYING
    deleted:    README.md

但是之后结帐不起作用。

$ git checkout devel
error: Your local changes to the following files would be overwritten by checkout:
    CMakeLists.txt
Please commit your changes or stash them before you switch branches.
Aborting

如何查看 clone --mirror 之后和删除除 .git 之外的所有内容之后的回购“状态”之间的区别,以了解为什么 checkout 在第一种情况下有效但在第二种情况下无效?

不支持将 core.baretrue 更改为 false。不要期望 任何东西 都能工作。

如果您了解 Git 的内部结构,就可以让它发挥作用。 (其他 SO 答案中的说明至少部分是由知道如何使其工作的人编写的。)但是,您随后知道为什么 not 将其与 --mirror.

有了 运行 git checkout,您在裸存储库中创建了一个索引(也称为暂存区)。您需要删除 索引 (rm .git/index)。这将解决问题,至少是暂时的。但是不要像这样将 bare 转换为 non-bare 并返回:它不受支持。

考虑将裸存储库保留为裸:您可以使用 git archive 从裸存储库中获取您想要的任何提交。有关详细信息,请参阅 the git archive documentationgit branchgit log 命令(以及许多其他命令)在裸存储库中工作,允许您找到散列 ID 以提供给 git archive.