2012-04-02 35 views
7

當您在.git目錄中時,允許哪些命令被允許,而哪些不允許。例如爲什麼在.git目錄中不允許使用某些git命令?

git symbolic-ref HEAD 

git diff --staged 

的罰款。

但是

git diff 

git status 

產生錯誤消息: fatal: This operation must be run in a work tree

更令人驚訝的:創建失敗命令之一的一個別名的上方,像git st對於git status那麼它的工作原理是

對此有任何合理的解釋嗎?爲什麼一個失敗的命令的別名突然工作,只是因爲它是一個別名?

回答

3

有一個合理的解釋。命令的參數失敗了,因爲它們需要一個工作樹,並且當你在.git存儲庫中時,沒有工作樹,只有存儲庫文件。其他命令的參數成功,因爲它們不需要工作樹。

+0

好點。這似乎是邏輯。這並不能解釋別名的行爲,雖然... – 2012-04-02 16:21:33

+0

什麼是別名? – GoZoner 2012-04-02 16:26:53

+0

正如丹·克魯茲在下面所說的,一些別名可能在倉庫之外工作,但不應該依賴,坦率地說,這聽起來很危險。 – GoZoner 2012-04-03 03:30:45

1

有幾個Git提交(git wrapper: allow setup_git_directory_gently() be called earlier,Call setup_git_directory() much earliergit --paginate: paginate external commands again)觸及正在發生的事情。內建命令和別名的不同行爲似乎源於之前需要內置命令才能獲得Git配置信息的前期問題,這需要確定Git目錄和工作樹以獲取特定於回購的配置。

如果您在本地擁有Git源代碼,則可以執行git log --grep='setup_git_directory_gently'以獲取與您注意到的行爲相關的提交列表。

爲什麼別名的行爲他們的方式,Accept git aliases outside a git repository解釋說:

af05d67(始終設置* nongit_ok在setup_git_directory_gently(), 2008-03-25)已經從最初提交的補丁導致的變化 禁用git倉庫以外的別名。

事實證明,使用了一些人「alias.fubar = DIFF - 顏色詞」在 $ HOME /的.gitconfig使用非指標DIFF(或不需要 Git倉庫中的任何命令)之外的git這個變化打破了他們, ,所以這再次支持這種用法。

相關問題