我試圖弄清楚如何使用第一次提交git init
之外master
的不同預設分支名稱,但我找不到它的 git config 或任何允許我執行此操作的內容(例如別名僅適用於命令,而不是分支名稱) 。
git init
有什麼方法可以更改設定的預設第一個分支名稱嗎?
答案1
從 Git 2.28(2020 年 7 月 27 日發布)開始,您現在可以配置初始化新儲存庫時所建立的分支的名稱:
$ git config --global init.defaultBranch main
設定此變數後,運行git init
將產生一個儲存庫,其初始分支為main
:
$ git init
Initialised empty Git repository in /home/thomas/test-git-repo/.git/
$ git status
On branch main
No commits yet
nothing to commit (create/copy files and use "git add" to track)
答案2
在 2.28 之前的 Git 版本中,HEAD
是硬編碼的指向refs/heads/master
.
if (create_symref("HEAD", "refs/heads/master", NULL) < 0)
因此,沒有可以傳遞的配置設定或選項來git init
將其變更為其他內容。
什麼是但可能的是在以下的幫助下改變HEAD
後面指向的內容git init
git symbolic-ref
:
$ git init
$ git symbolic-ref HEAD refs/heads/test
這將更改為HEAD
指向一個名為 的(尚不存在)分支test
。然後,當您建立第一個提交時,將呼叫分支test
而不是master
.
答案3
更改預設 HEAD 的一個簡單方法是在 git 範本目錄中建立一個 HEAD。首先,將模板目錄配置為~/Templates/git.git
(或任何您喜歡的目錄):
$ git config --global init.templateDir '~/Templates/git.git'
$ cp -r /usr/share/git-core/templates ~/Templates/git.git
HEAD
然後,在範本目錄中建立檔案:
$ echo 'ref: refs/heads/default' > ~/Templates/git.git/HEAD
你就可以出發了!每當您執行 時git init
,您現在都會收到訊息:
$ git init
Reinitialized existing Git repository in [...]
由於某種原因,git 根據HEAD
文件中是否存在來決定是否使用此訊息.git
,而不是依賴是否.git
必須建立。然而,它向您顯示什麼訊息並不重要。從 git-init 手冊頁:
git init
在現有儲存庫中運行是安全的。它不會覆蓋已經存在的東西。重新運行的主要原因git init
是選擇新添加的模板(或將儲存庫移動到另一個位置(如果--separate-git-dir
給定)。
也就是說,git init
保證不會覆蓋HEAD
您放入模板中的內容,也不會使用模板HEAD
來覆蓋現有的內容HEAD
。由於這是明確記錄的,因此您可以信賴它。
此外,它還說:
範本目錄中名稱不以點開頭的檔案和目錄
$GIT_DIR
建立後將複製到範本目錄中。
這意味著您還可以依賴在建立後立即複製的模板.git
,而不是稍後複製。
(當然,這是我個人對手冊的解釋。git 開發人員完全有可能不同意。)
答案4
如前所述,HEAD 被硬編碼為指向 master。但是,您可以建立 shell 別名,以執行git init
您喜歡的操作。如果您使用 bash 作為 shell,請在 .bashrc 中新增以下內容:
function git_init_fnc () {
default_branch="main"
if [[ $1 == "init" ]] && [[ $# -eq 1 ]];then
git init
if [[ ! -z $(git branch -a | grep $default_branch) ]]; then
git checkout "$default_branch"
else
git checkout -b "$default_branch"
fi
else
/usr/bin/git "$@"
fi
}
alias "git"=git_init_fnc
這會將命令替換git
為函數。該函數將使命令 git
運行完全相同,除非您git init
在沒有任何其他參數的情況下呼叫。當您調用git init
它將初始化存儲庫。接下來它將檢查分支“daddy”是否已經存在。如果是,它將檢查該分支,否則它將建立該分支並將您移至該分支。