纏鬥Git Bash

閱讀時間約 11 分鐘
一直以來都是靠手動的方式來進行檔案的版本管理,也就是自己複製檔案,然後改檔名,加入可以識別的編號。不過,越來越覺得,有必要用版本控制系統來幫忙,因為手動的方式實在很累人,而且當需要查找以前更動的內容時,非常沒有效率。當發現Spyder也有支援Git時,就想著:「好吧!那就試用看看好了。」
Git是相當多人使用的版本控制系統,本來只適用在Linux/Unix系統,不過現在也有Windows版本。本著盡量不在Windows安裝軟體的精神,先在Anaconda找找看有沒有,如果沒有的話,再來找看看有沒有免安裝版,再沒有的話,才摸摸鼻子用安裝版。
正如所料,Anaconda怎可能會沒有Git這個這麼多人在用的版本控制系統?滑鼠點個幾下,沒花多少時間就裝好了。裝好之後,在開始功能表中,出現了Git Bash圖示,滑鼠點一下,就進入Git系統,不過……是命令列介面,圖形化介面還得再下指令啟動。
命令列介面就命令列介面囉,反正很久很久以前,在沒有Windows的年代,大夥兒還不是Dos命令列介面用得不亦樂乎!再說多動動手、動動腦也可以延緩老化,降低失智的風險,老用圖形化介面,真的會變得比較懶得動腦筋、記憶力下降。
用了幾天之後,開始覺得受不了一件事了:每次打開Git Bash,都會身處/c/Users/username/Documents這個目錄中。這個目錄就是Windows的「文件」資料夾,利用檔案總管一層一層點進去,就是C:\使用者\username\文件。使用Windows時,通常會把個人的檔案放在C碟之外的分割區,也就是把系統和資料區分開來。現在每次打開Git Bash,都得從「文件」資料夾出發,下指令移到放檔案的資料夾,Git才能找到要管理的檔案。雖然說多動動手、多動動腦好處多多,但這種機械性的重複動作,實在沒必要做太多。那怎麼辦呢?有沒有辦法一打開Git Bash,就自動移到想要去的地方呢?
要想改變程式啟動時的啟始位置,第一個想到的辦法,當然就是去改捷徑檔囉。捷徑檔滑鼠右鍵,在「內容」裡頭的「開始位置」填入啟動時想要直接進入的資料夾位置,這樣就大功告成,從此王子和公主就過著幸福快樂的日子。只是……理想是豐滿的,但現實是骨感的,即便是王子和公主,也還是要吃喝拉撒睡柴米油鹽醬醋茶,本來想著是可以達到目的的做法,實測的結果是:無效!
怎會這樣?!爬文吧!網路上應該有答案。
網路上有不少人提到改「開始位置」的做法,看來這方法應該是可行的,可為什麼就偏偏不靈光?
在網路上看了不少討論之後,突然間醒悟到,那些討論有些是針對Linux上的Git,有些是針對Windows上的Git。而針對Windows上的Git的討論,使用的是Git for Windows,而不是由Anaconda所安裝的Git。再仔細看一下捷徑檔「內容」裡頭的「目標」,哇咧!長長一大串,同時用到了好幾個東西,看來是很難從這裡理出個頭緒來了。不過,在這長長一大串後面的幾個字:bash.exe,倒是可以研究一下,因為讓人想到Linux裡頭的bash。
果然!bash.exe就是Linux裡頭的bash。事實上,Git Bash可以看成是同時提供git和bash功能的shell。這可真是柳暗花明又一村,在Linux裡頭的一些招式,應該可以拿來試看看。
啟動bash的時候,會自動先去找看看有沒有.bashrc、.bash_profile、.bash_login這幾個特定的script檔來執行,所以如果把需要的動作寫在裡頭,應該就能達到目的。
找了老半天,沒有就是沒有,完全沒有這幾個檔案的蹤跡。除了找這幾個特定的檔案外,連conda本身的設定檔都打開來看,仍是一無所獲。不過在看profile.d裡頭的檔案內容時,倒是重溫了一下剛接觸shell script程式時,被逗樂了的心情。
跟其他程式一樣,在shell script程式中,也有條件判斷、迴圈等結構。為了要明確指示出結構從程式的哪一行開始,以及到哪一行結束,不同的程式語言,會有不同的標記方式,有用大刮號的;有在結尾加個關鍵字end的,比較特別的是Python,它不太合群,用的是縮排。至於shell script程式,就更不合群了,除了有do… done,還有if… fi、case… esac。
「done」符合英文文法,可以理解,可是「fi」、「esac」?!這啥鬼玩意兒啊?怎會用些這麼莫名奇妙的字?要用也用比較有意義好記的字,if… end或if… end if;case… end或case… end case,怎都比if… fi、case… esac要容易記。瞪著這些詭異的字眼,突然間,被逗樂了。原來,那並不是什麼詭異的字眼,只不過就是if和case倒過來拼。真虧設計的人想得出來,居然用了個這麼頑皮的方式,來設計充滿高科技硬梆梆感覺的程式語言。有時候真覺得,科技人的心裡頭,其實都住著個頑皮的小男孩。
重溫過往日被逗樂的心情後,繼續想辦法解決問題。
在看profile.d裡頭的檔案內容時,有注意到裡頭用了Windows的環境變數。直接去改Windows的環境變數,應該也可以達到目的。不過,這決不是個好主意,畢竟那是所有應用程式都可能會用到的東西,影響範圍會有多大,實在是沒法知道。
看來只好自己寫shell script了,反正就只是要移動到不同的目錄而已,應該可以很快搞定。
說來無奈,每次只要覺得很簡單很快可以搞定的事情,往往到最後會搞得頭昏腦脹,費盡九牛二虎之力才完成,不禁讓人懷疑,老天爺似乎特別喜歡捉弄太過志得意滿的人。不到一分鐘.bashrc這個shell script就寫好了,就一行程式而已。然後……失敗!沒用!
真的是讓人傻眼,就只有一行程式而已,怎麼會失敗?改用手動執行看看,還是不行。把寫在script裡頭的程式,直接在Git Bash中輸入執行,一點問題都沒有,可以成功移動到想要的目錄去。所以,程式本身沒問題,是其他地方出了問題。這時候,就只能上網找答案了。不過,既然知道現在面對的是bash,那關鍵字就不要用Git Bash,而改用bash。
原來,在執行shell script的時候,會在原本的shell之外,另外開啟subshell去執行。等執行完之後,關閉subshell,然後回到原來的shell,落葉歸根的在原來的shell結束工作。既然最後會回到原來的shell,而原來的shell一直都沒離開原來的位置,所以中間不管subshell溜到哪個目錄去,結果還是會回到原來的目錄。要避免這種狀況,執行shell script的時候,要用source這個指令,或者偷懶用句點「.」代替也可以,這樣shell script就會在原來的shell執行,而不是丟到subshell去執行。既然是在原來的shell執行,所以當shell script裡頭的指令要求移動到其他目錄去的時候,是原來的shell真的移動到那裡去,最後當執行完shell script的工作後,就會拋開一切留在那裡,不會再跑回原來的地方。所以原來執行.bashrc時,下的指令是./.bashrc,現在只要改成source .bashrc,或. .bashrc就可以了。
手動執行測試看看,真的可以耶!哈!總算搞定了!不過為了要能夠自動執行,還得多動些手腳,把原本的.bashrc檔,改寫成兩個檔案。改寫後的兩個檔案,一個是.bashrc檔,裡頭的程式只有一行,就是用source去執行另一個檔案;而另一個檔案,裡頭的程式,就是要移動到其他目錄的指令。
寫兩個只有一行程式的檔案,這種簡單的工作,不到一分鐘就搞定,然後……都說老天爺喜歡捉弄人,然後又是失敗!
天啊!又是哪裡有問題?啟動bash時,不是應該會自動去執行.bashrc這個檔案嗎?怎麼會不行?在裡頭加一行程式,印出些東西,這樣就知道啟動時有沒有執行了。
啟動Git Bash時,居然沒去執行.bashrc檔,啥狀況?
咦?!測試的過程中,曾經為了回到開啟Git Bash時所在的位置,也就是home directory,直接下了指令cd ~,用「~」來取代長長的一串路徑字串,結果到達的目錄是/c/Users/username,而不是/c/Users/username/Documents。換句話說,home directory是/c/Users/username,而不是開啟Git Bash時所在的/c/Users/username/Documents。原來如此!難怪沒自動執行.bashrc檔。
把.bashrc檔移到/c/Users/username之後,邊想著這下總該沒問題了,邊重新啟動Git Bash,然後……是的,又再一次的然後。不過這次成功了,只是有幾行警告文字出現,說是設定有問題,找不到.bash_profile、.bash_login、.profile其中任何一個檔案,然後很貼心地幫忙造出.bash_profile這個檔案,並把.bashrc的內容放進去。呃……印象中在捷徑檔「內容」裡頭的「目標」那一欄,裡頭長長一大串字的最後,有著bash.exe --login幾個字。啟動bash時,如果有給login這個選項,會去找那三個檔案來執行;如果沒有給login這個選項,才會去執行.bashrc檔。所以說,開啟Git Bash時,會去自動執行的,不是.bashrc,把檔名改成.bash_profile就可以了。
或許是被老天爺作弄好幾次之後,不再信心十足覺得一定沒問題,老天爺認為孺子可教,不再作弄人;也或許是老天爺玩夠了,這一次,總算成功了,王子與公主終於可以過著幸福快樂的生活了。
就在開始動筆寫這篇隨筆前,赫然發現,老天爺其實還是挺照顧人的。怎麼說呢?先前發現檔案放錯地方時,只把後來改成.bash_profile的.bashrc移到home directory,也就是/c/Users/username,而把另一個檔案仍放在/c/Users/username/Documents。如果那時候把兩個檔案都移到home directory,那就會出問題,然後又是一段艱苦的奮鬥旅程。至於為什麼這樣會出問題呢?推測可能的原因,應該是啟動Git Bash後,即使沒有.bash_profile這個檔案,也會執行一堆設定好的指令,裡頭一定包括移動到/c/Users/username/Documents去。現在有.bash_profile這個檔案也要執行,那就等所有指令都執行完後再來執行。也就是說,執行.bash_profile時,所在的位置是在/c/Users/username/Documents。另一個檔案如果不是放在這裡,會找不到而出錯。至於是不是真的是這個樣子,實在是沒力氣去深究了。話說回來,即使想深究,也不知從何找起,畢竟是透過Anaconda安裝在Windows上,檔案和目錄擺放的位置跟在Linux系統上不太一樣。這場和Git Bash的較量,應該就在這兒打住,或許哪天因緣巧合之下,答案會出現也說不定。
Git Bash還真是難纏啊!
為什麼會看到廣告
avatar-img
15會員
131內容數
寫點東西自娛娛人
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
ysf的沙龍 的其他內容
看到了一段程式碼,一段乍看之下覺得挺詭異,懷疑是不是寫錯,但搞清楚之後卻拍案叫絕,冷靜下來後卻覺得這樣寫不怎麼好的程式碼。
寫程式最怕碰到的,就是信心滿滿地寫好程式後,發現結果不如預期,而且完全看不出問題出在哪裡。這種慘況可以分成兩種:一種是程式很長、很複雜,想要把心機很重,躲在幽暗深處的臭蟲給抓出來,即使有功能強大的除錯工具,都不是件簡單的事;另一種是程式沒幾行,一切看起來都很清楚正常,臭蟲根本沒地方躲藏,可是結果就是
解決了Spyder和turtle之間的不合後,就來畫些漂亮迷人的fractal圖案,也順便練習一下recursive function的寫法。
龜兔賽跑,第一回合兔子因為太輕敵,在半路上呼呼大睡睡過頭,輸了比賽。 雖然輸了第一回合的比賽,不過兔子並沒有灰心喪志,牠記取教訓,買了個功能齊全的運動手錶來戴,睡覺前先定好鬧鐘時間,這樣就不怕睡過頭而輸了比賽。從此龜兔賽跑,兔子照樣在半路上睡覺補充體力,但再也沒有因為睡過頭而輸了比賽。
「學程式,數學要很好嗎?」這問題的答案其實很簡單,就是:Yes and no。
「天啊!這程式怎麼這麼醜!」瞪著螢幕上先前寫的程式,不禁從心底冒出這樣的一句話。
看到了一段程式碼,一段乍看之下覺得挺詭異,懷疑是不是寫錯,但搞清楚之後卻拍案叫絕,冷靜下來後卻覺得這樣寫不怎麼好的程式碼。
寫程式最怕碰到的,就是信心滿滿地寫好程式後,發現結果不如預期,而且完全看不出問題出在哪裡。這種慘況可以分成兩種:一種是程式很長、很複雜,想要把心機很重,躲在幽暗深處的臭蟲給抓出來,即使有功能強大的除錯工具,都不是件簡單的事;另一種是程式沒幾行,一切看起來都很清楚正常,臭蟲根本沒地方躲藏,可是結果就是
解決了Spyder和turtle之間的不合後,就來畫些漂亮迷人的fractal圖案,也順便練習一下recursive function的寫法。
龜兔賽跑,第一回合兔子因為太輕敵,在半路上呼呼大睡睡過頭,輸了比賽。 雖然輸了第一回合的比賽,不過兔子並沒有灰心喪志,牠記取教訓,買了個功能齊全的運動手錶來戴,睡覺前先定好鬧鐘時間,這樣就不怕睡過頭而輸了比賽。從此龜兔賽跑,兔子照樣在半路上睡覺補充體力,但再也沒有因為睡過頭而輸了比賽。
「學程式,數學要很好嗎?」這問題的答案其實很簡單,就是:Yes and no。
「天啊!這程式怎麼這麼醜!」瞪著螢幕上先前寫的程式,不禁從心底冒出這樣的一句話。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇文章將介紹工程師使用版控和git的相關知識和技能,包括版本控制的意義和git的基本指令,以及開發流程和webhook的概念。
今天學習Git Command-Line Syntax [1] 。 Git command的 convention 為: `git [switches] <command> [<args>]` 而每一個部分的基本解釋是: - `git` 是 Git 命令的開頭 - `[s
Windows : 下載Git (git-scm.com)並按照指示安裝。 安裝完成後,你可以通過運行以下命令來確認安裝是否成功: git --version 初次設定GIT 接下來就是按照初次設定git,會需要配置你的用戶名和電子郵件地址,這些信息將被記錄在您提交的每個變更中。 git
Thumbnail
本篇文章介紹如何使用Git Bash進行版本控制操作,包括創建repository、查看狀態、歷程以及加入暫存和提交暫存等操作。透過基本的Git指令,您可以更深入地瞭解Git工具的使用方法。
※ 需要做版本備份時: git init:初始化此資料夾,由git 開始追蹤版本控制。 git add:將檔案加入到暫存區。 git commit:把暫存區的內容提交到儲存庫。 git status:查看目前所有檔案的狀態。 git log:查看過去所有commit的記錄。 ※ 需要做修
※ 簡短說明Git 和 Git Flow 是什麼?如何應用? Git 是什麼? Git是一個分散式版本控制軟體,能夠紀錄檔案的狀態變化,以及協調多個開發者之間的工作。它允許團隊成員協作編輯和管理項目的代碼庫,並且能夠追蹤文件的歷史變更、恢復到以前的版本、合併不同版本的代碼,以及解決代碼衝突等。
※ Git(四) 空的資料夾無法被加入 Git 進行版本控制,但這個資料夾如果又是很重要的資料夾,你會怎麼處理? 當空的目錄無法被加入 Git 進行版本控制時,有以下的做法可以解決: 在那個空目錄裡隨便放一個檔案就行了。 在這個資料夾中添加一個名為 .gitkeep 的空檔案,讓 Git 能
Thumbnail
最近在找資料的時候,偶然發現了兩個有趣的 git 指令:git commit --fixup 和 git rebase -i <sha> --autosquash。 研究了下發現對於像我這種每次 commit 都要斤斤計較,盡可能完美的人來說非常好用,因此寫一篇筆記記錄一下用法。
Thumbnail
由於開發多個專案的時候,頻繁切換本地環境的PHP版本實在太麻煩,於是想要可以直接使用指令就完成切換的功能,於是有了這篇文章。
關於Git(一) 版本管理系統是什麼?為什麼要用? 版本管理系統(Version Control System,VCS)是一種追蹤和管理項目代碼、文件和資源變更的工具。 工作流程上可防止每個人因使用自己的開發程式搭配不同且不相容的工具所引起的混亂。版本控制會同步處理版本,並確定變更不會與其他人
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇文章將介紹工程師使用版控和git的相關知識和技能,包括版本控制的意義和git的基本指令,以及開發流程和webhook的概念。
今天學習Git Command-Line Syntax [1] 。 Git command的 convention 為: `git [switches] <command> [<args>]` 而每一個部分的基本解釋是: - `git` 是 Git 命令的開頭 - `[s
Windows : 下載Git (git-scm.com)並按照指示安裝。 安裝完成後,你可以通過運行以下命令來確認安裝是否成功: git --version 初次設定GIT 接下來就是按照初次設定git,會需要配置你的用戶名和電子郵件地址,這些信息將被記錄在您提交的每個變更中。 git
Thumbnail
本篇文章介紹如何使用Git Bash進行版本控制操作,包括創建repository、查看狀態、歷程以及加入暫存和提交暫存等操作。透過基本的Git指令,您可以更深入地瞭解Git工具的使用方法。
※ 需要做版本備份時: git init:初始化此資料夾,由git 開始追蹤版本控制。 git add:將檔案加入到暫存區。 git commit:把暫存區的內容提交到儲存庫。 git status:查看目前所有檔案的狀態。 git log:查看過去所有commit的記錄。 ※ 需要做修
※ 簡短說明Git 和 Git Flow 是什麼?如何應用? Git 是什麼? Git是一個分散式版本控制軟體,能夠紀錄檔案的狀態變化,以及協調多個開發者之間的工作。它允許團隊成員協作編輯和管理項目的代碼庫,並且能夠追蹤文件的歷史變更、恢復到以前的版本、合併不同版本的代碼,以及解決代碼衝突等。
※ Git(四) 空的資料夾無法被加入 Git 進行版本控制,但這個資料夾如果又是很重要的資料夾,你會怎麼處理? 當空的目錄無法被加入 Git 進行版本控制時,有以下的做法可以解決: 在那個空目錄裡隨便放一個檔案就行了。 在這個資料夾中添加一個名為 .gitkeep 的空檔案,讓 Git 能
Thumbnail
最近在找資料的時候,偶然發現了兩個有趣的 git 指令:git commit --fixup 和 git rebase -i <sha> --autosquash。 研究了下發現對於像我這種每次 commit 都要斤斤計較,盡可能完美的人來說非常好用,因此寫一篇筆記記錄一下用法。
Thumbnail
由於開發多個專案的時候,頻繁切換本地環境的PHP版本實在太麻煩,於是想要可以直接使用指令就完成切換的功能,於是有了這篇文章。
關於Git(一) 版本管理系統是什麼?為什麼要用? 版本管理系統(Version Control System,VCS)是一種追蹤和管理項目代碼、文件和資源變更的工具。 工作流程上可防止每個人因使用自己的開發程式搭配不同且不相容的工具所引起的混亂。版本控制會同步處理版本,並確定變更不會與其他人