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 回购相关的信息。
- 克隆所有分支:
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 中解释)。
- 要转换为裸:
已执行:
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.bare
从 true
更改为 false
。不要期望 任何东西 都能工作。
如果您了解 Git 的内部结构,就可以让它发挥作用。 (其他 SO 答案中的说明至少部分是由知道如何使其工作的人编写的。)但是,您随后知道为什么 not 将其与 --mirror
.
有了 运行 git checkout
,您在裸存储库中创建了一个索引(也称为暂存区)。您需要删除 索引 (rm .git/index
)。这将解决问题,至少是暂时的。但是不要像这样将 bare 转换为 non-bare 并返回:它不受支持。
考虑将裸存储库保留为裸:您可以使用 git archive
从裸存储库中获取您想要的任何提交。有关详细信息,请参阅 the git archive
documentation。 git branch
和 git log
命令(以及许多其他命令)在裸存储库中工作,允许您找到散列 ID 以提供给 git archive
.
最终我想要一个干净的方法来 return 压缩(例如裸)repo 准备好被签出(好的,对于迂腐的:在额外的 core.bare false
之后)到任何分支.我已阅读 How to convert a normal Git repository to a bare one? 的热门答案。如评论中所述,使用 clone
会丢失配置条目,以下是尝试使用接受的答案后出现的问题。也许对此有一个简单的微不足道的修复,这就是为什么我在评论中找不到它的原因。
TL;DR
我正在尝试理解与裸 git 回购相关的信息。
- 克隆所有分支: 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 中解释)。
- 要转换为裸:
已执行:
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.bare
从 true
更改为 false
。不要期望 任何东西 都能工作。
如果您了解 Git 的内部结构,就可以让它发挥作用。 (其他 SO 答案中的说明至少部分是由知道如何使其工作的人编写的。)但是,您随后知道为什么 not 将其与 --mirror
.
有了 运行 git checkout
,您在裸存储库中创建了一个索引(也称为暂存区)。您需要删除 索引 (rm .git/index
)。这将解决问题,至少是暂时的。但是不要像这样将 bare 转换为 non-bare 并返回:它不受支持。
考虑将裸存储库保留为裸:您可以使用 git archive
从裸存储库中获取您想要的任何提交。有关详细信息,请参阅 the git archive
documentation。 git branch
和 git log
命令(以及许多其他命令)在裸存储库中工作,允许您找到散列 ID 以提供给 git archive
.