前言


  • 現在的 git for windows 已經改用 MSYS2 當作執行環境的基礎了. 如果需要自己重新編譯 git for windows 的話, 也有 git for windows SDK 可用, 不再需自己重新由 MSYS2, GCC, git... 一路安裝設定, 接著還要下載原始程式, 上 patch, 才能開始編譯 git. 我以前自己試著作過一次, 結果是一關接著一關的卡, 卡關卡得非常嚴重... 不只是挑戰你對 unix/linux 環境及指令的了解, 更要具備對 GNU cygwin 開發環境的知識. 總之就是沒有神人帶你走過一遍真的很難順利把建置的環境弄好.
  • 日前想為 git for windows 加裝個python, 可是一直找不到直接給 MSYS2 用的(註一), 只找到獨立安裝的 python for windows. 雖然一樣可以在 git for windows 的bash視窗中使用, 但是 git for windows SDK 裡明明就有python可用啊! 於是想到何不想辦法自行安裝這個版本的python呢? 但是問題來了 git for windows 內部沒有附pacman指令, 沒辦法像 git for windows SDK 或者是 MSYS2 那樣直接用pacman安裝. 於是再一次的找 Google 大神幫忙, 找到了 StackOverflow 這一篇 很快的就把它搞定了.

註一: 後來發現原來是自己的搜尋方法不得當, 原來都在 MSYS2 的版本資料庫網站: http://repo.msys2.org/ 裡. orz

其實最重要的是裝了pacman之後呢, 發現有缺什麼工具或指令就可以直接安裝 MSYS2 的版本, 不必像以前那樣一定得找 Windows 原生的替代程式, 或是 GnuW32 的版本, 或是 Cygwin 的版本了.

Step 1: 安裝 pacman


  1. pacman的安裝檔我們可以從 MSYS2 的版本資料庫中下載到: 網站裡面有各個指令的 (多個版本的) .tar.xz 壓縮的 tarball 安裝檔. 我們只要下載最新版的pacman就可以了.
    我自己下載了 pacman-5.1.2-1-x86_64.pkg.tar.xz 這個版本.

    網站裡面有各個指令的 (2~3年內的, 多個版本的) .tar.zst壓縮的 tarball 安裝檔 (2018 年我寫這一篇時用的還是 .tar.xz壓縮檔).
    手動安裝 pacman 套件需要下列 3 組檔案.
    • pacman
    • pacman-mirrors
    • msys2-keyring
    我們只要下載各自的最新版就可以了. 這裡列出目前 (2022/03/06) 的版本
  2. 接著我們要把這 3 個壓縮的 tarball 解開到根目錄 (/)裡(註二) (小心! 這些 tarball 都是用相對路徑的). 不過在此我們陷入死迴圏了:
    • MSYS2 的版本資料庫網站上的 zstd 指令安裝檔是 .tar.zst 壓縮檔.
    • Win10 內建的功能無法處理 zstd 檔壓縮.
    • git for windows 沒有內附 zstd 指令
      (git for windows SDK 倒是有這個指令).
    因此我們們得另外找出路, 幸好:
    • Zstandard 在 Github 網站上提供了 Windows 版 (32位元及64位元) 的 zstd.exe 指令及原始碼.
    • 也有人提供了支援 zstd 壓縮功能的 7z (7-Zip-zstd).

    如何在 Windows 解開 .zst 檔

    7-Zip-zstd 的操作與 7-Zip 相同, 這裡我就不多說明了. 如果你選擇用 zstd.exe 指令的話請下載 Windows 相應的版本, 解開後壓縮檔, 用指令:

    zstd -d xxx.tar.zst
    
    即可解開第一層變成 .tar 檔. 後面就可以接著用 tar 指令把他們解開到正確位置.

    如何將 tarball 檔解開到根目錄

    tar 指令已經能自動偵測壓縮檔格式, 不需另外指定參數就可以處理 .tar.gz, .tar.xz, tar.zst... 下面我以 pacman 為範例, 其他幾個檔案請自行類推.

    $ tar xvf pacman-6.0.1-9-x86_64.pkg.tar --directory /
    
    或者是
    $ tar xvf pacman-6.0.1-9-x86_64.pkg.tar -C /
    
    或者是 (假設 .tar 檔是放在使用者的家目錄 (~)下)
    $ cd /
    $ tar xvf ~/pacman-6.0.1-9-x86_64.pkg.tar
    
    不過, 這樣完成之後你的根目錄 (即 git for windows 的安裝目錄) 裡會多三個 linux 的隱藏檔, 請將它們刪除
    • .BUILDINFO
    • .MTREE
    • .PKGINFO
    其實也可以解開壓縮檔時就把它們排除
    $ tar xvf pacman-6.0.1-9-x86_64.pkg.tar -C / --exclude .[BMP]* --wildcards
    

    Update(2022/03/07)

    如果你有啟用 WSL2, 那再好不過了. 你可以為你所安裝的 linux distro 加裝 zstd 指令, 然後直接利用他來完成下一個步驟. 以 ubuntu 20.04 distro (或者 ubuntu distro) 為例, 安裝指令如下:

    $ sudo apt install -y zstd
    

    安裝完成後, 同樣用該 distro 的 tar 指令就可以幫我們把檔案解壓縮到 git for windows 的根目錄. 不過要注意的是 git for windows 的根目錄在 WSL 的 distro 裡應該是要換成 /mnt/c/Program\ Files/Git (同樣的, 也是要以系統管理員身份執行啟動 distro, 否則會有權限問題).

    $ tar xvf pacman-6.0.1-9-x86_64.pkg.tar.zst -C /mnt/c/Program\ Files/Git --exclude .[BMP]* --wildcards
    
  3. 除了直接把這 3 個壓縮的 tarball 解開到根目錄裡; 我們也可以多下載 zstd 指令的壓縮 tarball 檔: zstd-1.5.2-1-x86_64.pkg.tar.zst. 在 windows 裡將這個 .tar.zst 檔解開成 .tar 檔, 然後再使用 tar 指令將這個 tarball 檔解開到根目錄. 這樣接下來的 tar 指令就認得 zstd 格式了.
    $ tar xvf zstd-1.5.2-1-x86_64.pkg.tar -C / --exclude .[BMP]* --wildcards
    $ tar xvf pacman-6.0.1-9-x86_64.pkg.tar.zst -C / --exclude .[BMP]* --wildcards
    $ tar xvf pacman-mirrors-20220205-1-any.pkg.tar.zst -C / --exclude .[BMP]* --wildcards
    $ tar xvf msys2-keyring-1_20211228-1-any.pkg.tar.zst -C / --exclude .[BMP]* --wildcards
    
  4. 再來我們需要 git for windows SDK 裡的二個目錄(註二). 這二個目錄一個是 pacman 的設定, 一個是 pacman 在不同執行環境用的 keyrings.
  5. 再來我們需要重建 pacman 檢驗版本來源用的金鑰資料庫, 並由/usr/share/pacman/keyrings重新載入預設的 key ('msys2').
    $ pacman-key --init
    $ pacman-key --populate msys2
    
  6. (選項) 附加上 'git-for-windows' 的 keyrings
    git for windows 和 MSYS2 有點小不同 (例如: bash 的版本沒有跟上 MSYS2 的), 所以我們也可以同步 git for windows 的版本資料庫. 首先從 github 下載 git for windows 的下列三個檔案:
    • pacman.conf
    • git-for-windows.gpg
    • git-for-windows-trusted
    $ curl https://raw.githubusercontent.com/git-for-windows/git-sdk-64/main/etc/pacman.conf -o /etc/pacman.conf
    $ curl https://raw.githubusercontent.com/git-for-windows/build-extra/master/git-for-windows-keyring/git-for-windows.gpg -o /usr/share/pacman/keyrings/git-for-windows.gpg
    $ curl https://raw.githubusercontent.com/git-for-windows/build-extra/master/git-for-windows-keyring/git-for-windows-trusted -o /usr/share/pacman/keyrings/git-for-windows-trusted
    
    git-for-windows 參數再執行一次 pacman-key --populate, 然後就可以從 git for windows 版本資料庫中下載 git-for-windows-keyring 這個 package 了.
    pacman-key --populate git-for-windows
    pacman -Sy git-for-windows-keyring --overwrite "*"
    
  7. 更新金鑰資料庫裡的金鑰 (如果確定已經是最新版的 key 了, 可以不用執行)
  8. $ pacman-key --refresh-keys
    
  9. 更新 msys (這一步不能省, 否則 pacman 無法正確動作)
  10. $ pacman -Syu
    
pacman00

pacman-key --initpacman-key --populate msys2的執行結果

pacman01

pacman -Syu --force的執行結果

接著我們就可以安裝我們需要的套件軟體了? :( 還有點小問題...

註二: MSYS2 的根目錄 (/) 即為你安裝它的所在. 所以, 如果你的 Git for Windows 安裝在預設的 "C:\Program Files\Git\" 底下. 目前 Windows 對於 C:\Program Files\ 目錄是有寫入保護的, 所以你需要使用系統管理員身份執行 Git Bash 才能順利將檔案解開並放到根目錄 (/ ). 否則會出現權限不足的問題.

註二: 我把目前的版本放在這個 下載連結, 下載後請你一樣用 tar xvf your_file_name -C / 解開到根目錄裡.

Step 2: 安裝套件


這裡我們有二件事需要特別注意:

  1. git for windows 64 位元用的 package 有部份是有前置這個字串mingw-w64-x86_64-的版本(註三), 因此有些 package 一共會有二種版本
    • 一般 msys2 的版本 (這個是使用 POSIX 介面的)
    • 前置mingw-w64-x86_64- (64bit Windows 平台用) 的版本,
      或前置mingw-w64-i686- (32bit Windows 平台用) 的版本.

    所以像是 AI 常用的python套件, 在 git for windows 64 位元版上就有基本 msys2 的版本:

    • python
    • python-pip

    還有比較舊的 python2

    • python2
    • python2-pip
    也有mingw-w64-x86_64-的版本:
    • mingw-w64-x86_64-python
    • mingw-w64-x86_64-python-pip
    • mingw-w64-x86_64-python2
    • mingw-w64-x86_64-python2-pip
    到底應該用哪一個版本, 基本上應該是先以沒有mingw-w64-x86_64-的版本為優先 (這個版本一般相容性比較好). mingw-w64-x86_64-的版本通常會和 windows 的某些功能結合得比較好, 但是很可能會出現一些相依套件的相容性問題, 所以我們得自行斟酌小心使用.
  2. 由於pacman是我們自行補裝上去的, 所以我們並沒有原先 git for windows 已經裝好的套件的 pacman 版本資訊資料庫, 所以安裝套件時用的pacman -Sy指令要改成pacman -Sdd(註四)才能順利安裝成功. 例如: 安裝python要用下列指令
    $ pacman -Sdd python
    
    而不是原先的
    $ pacman -Sy python
    

註三: git for windows 32 位元用的 package 則有部份是前置這個字串mingw-w64-i686-.

註四: 參數-Sdd是安裝套件時強制不檢查相依性, 所以可能會有缺漏一些套件, 或者有時某些套件必需昇級才行.
另一個方法是用pacman -Sd xxx_package來安裝xxx_package, 出現錯誤時再附加上--assume-installed yyy_package --assume-installed zzz_package如果出錯的是yyy_package, zzz_package. 有些 package 的相依性非常多時指令就會變得非常的長, 需要一點耐心.

Update(2022/03/07)

依據 Michael Chen 於 Dec 8, 2020 at 17:50 對於StackOverflow 這一問題的回覆, 以下的 bash 指令可以重新把 git for windows 所有指令的版本資訊 (metadata) 由 github 網站上取回. 有了這一些版本資訊後面要安裝 bison 及 flex 二個指令就會比較容易一些了.

URL=https://github.com/git-for-windows/git-sdk-64/raw/main
cat /etc/package-versions.txt | while read p v; do d=/var/lib/pacman/local/$p-$v;
 mkdir -p $d; echo $d; for f in desc files install mtree; do curl -fsSL "$URL$d/$f" -o $d/$f;
 done; done

注意: 由於 github 上的 metadata 只保留最新的版本, 即使安裝的已經是最新的 git for windows 也可能會少了幾個指令的 metadata. 原因是 git for widnows SDK 已經改用新版本. 此時你可以用下列指令將這些空的 metadata 目錄刪除.

find /var/lib/pacman/local  -type d -empty -delete

然後使用以下指令把新版本裝上

pacman -S metadata_missing_package --overwrite "*"
# 例如:
pacman -S nano --overwrite "*"

萬一上列指令所列的也不是 git for windows SDK 所用的版本 (可以到 git for windows 在 github 上的這個 URL上找到), 則可以到http://repo.msys2.org/找到對應的 package 版本, 再用下列的指命安裝指定的版本.

pacman -U url_for_metadata_missing_package --overwrite "*"
# 例如:
pacman -U https://repo.msys2.org/msys/x86_64/nano-5.9-1-x86_64.pkg.tar.zst --overwrite "*"

完整安裝 python (python3, python2, pip)


目前 msys2 的python安裝的已經是python3, 所以要完整安裝python3, python2pip請使用下列指令:

$ pacman -Sdd python
$ pacman -Sdd python-pip

安裝完成之後, 如果要更新pip

$ pip install --upgrade pip

這樣python常用的pip指令也一併可以正常使用了.

目前 (2019/01/10) 這個方法還有一問題: 無法成功安裝 PyInstaller. 有看到 github 上有人提問了, 等 patch 完全併入主版後再告訴大家.

安裝套件範例: bison, flex


除了上面python的例子, 這裡我們舉個沒有mingw-w64-x86_64-套件的例子: binsonflex. 一般開發語彙分析或語法分析功能的程式 (例如: script language) 都會用到binsonflex這二個套件. 這二個套件也剛好有點冷門, 所以目前在 MSYS2 的環境裡是找不到mingw-w64-x86_64-binsonmingw-w64-x86_64-flex, 就是只有binsonflex這二個, 不過有這二個就足夠了. (我以前安裝的是 GnuWin32 版本, 版本非常的舊而且看起來好像沒人在維護了, 整個就是一個老掉牙).

下圖3. 上半部顯示一共需要安裝 8 個套件, 你可以直接用pacman -Sdd bison flex來安裝他們. 不過這裡我用了另外一種方法, 所以如圖3. 下半部和圖4. 所示我用pacman -Sy bison flex安裝他們, 而且也只安裝了這二個而已, 其他的 6 個套件就直接不見了.

其實這是因為我很確定安裝binsonflex額外需要的這 6 個程式庫剛好 git for windows 裡都已經安裝. 同時我手上也剛好有 git for windows SDK, 於是我就把他們的 pacman 版本資訊資料庫從 git for windows SDK 裡直接拷貝過來. 拷貝過來之後再執行一次pacman -Sy bison flex, 你就會看到和我貼的一樣的畫面. 這樣在安裝相依套件非常多的套件時, 就會容易一些. 但是缺點是得先裝一次 git for windows SDK.

另外, pacman 版本資訊資料庫的位置是在/var/lib/pacman/local, 一個套件一個子目錄, 我們只要拷貝需要的部份即可, 不必也不可以全部都拷貝過來.

bison_flex01

bisonflex安裝過程-1

bison_flex02

bisonflex安裝過程-2

Git for Windows 疑難雜症


請參考這一篇貼文.

arrow
arrow

    MagicJackTing 發表在 痞客邦 留言(0) 人氣()