2025年1月10日 星期五

git 無更動檔案 合併當前到主分支

git 無更動檔案 合併當前到主分支

最大的分支雖然都是由PR合併的,但是開發的次要主線規模不大太大還是有可能會讓開發者自己管理的

在這種情況下每當做好功能之後會合併回去還得退回,檔案會經過一次大洗牌,這邊提供一個可以不更動檔案的方式合併到分支

為什麼會洗牌是因為git並不提交 merage to 他只有 merage from,就注定你只能切過去不然不要合

解法是還是得造一個工作區,但是不是當前的目錄,而次第二個工作樹,在次要的工作樹合併這件事情就解決了

大概需要底下幾個流程

# 進入主工作樹目錄
cd "Z:/my-project"

# 新增臨時工作樹,檢查出目標分支
git worktree add "Z:/my-project-dev" dev

# 在臨時工作樹中進行合併
cd "Z:/my-project-dev"
git merge fix

# 合併完成後,回到主工作樹刪除臨時工作樹
cd "Z:/my-project"
git worktree remove "Z:/my-project-dev"

對就是單純的在檢出一個工作樹就行了,不過做完記得要刪除因為那個工作樹是會佔用分支的,會導致你的主目錄切不過去。

2024年12月16日 星期一

SQLServer 搬移資料庫到D曹

SQLServer 搬移資料庫到D曹

要搬移的資料庫檔案在C裡面,比較快的方法是打下面的指令可以查出所有表儲存位置

USE master;
GO

SELECT 
    db_name(database_id) AS DatabaseName, 
    type_desc AS FileType, 
    physical_name AS FilePath
FROM sys.master_files
ORDER BY db_name(database_id), type_desc;

查出來之後先儲存下來等一下要一個一個手動掛回來會比較方便

再來需要停止 SQLSERVER 服務,停掉之後就可以直接開始搬檔案了

搬完之後由於服務啟動至少需要下面這三個東西,這個手動改一下
(或是不想改下圖這三個就不要搬,讓它保持在C曹搬你自己創建的就好)



這三個關鍵檔案改好就可以啟動了

啟動後會是一個全空的DB,用下面指令一個一個掛回來

下面的範例是把資料庫名稱 CHG 掛回來的指令
(把所有CHG改成你的資料庫名稱即可)

USE master;
GO
ALTER DATABASE CHG 
MODIFY FILE (NAME = 'CHG', FILENAME = 'D:\MSSQL\DATA\CHG.mdf');
GO
ALTER DATABASE CHG 
MODIFY FILE (NAME = 'CHG_log', FILENAME = 'D:\MSSQL\DATA\CHG_log.ldf');
GO
ALTER DATABASE CHG SET ONLINE;
GO


數量很多的話自己寫個腳本執行吧

下面是寫成動態 TSQL 的範例


-- 設置基礎路徑
DECLARE @BasePath NVARCHAR(255) = 'D:\MSSQL\DATA\';

-- 資料庫清單
DECLARE @DatabaseList TABLE (DatabaseName NVARCHAR(128));
INSERT INTO @DatabaseList VALUES 
('CHG1'),
('CHG2'),
('CHG3');

-- 定義變數
DECLARE @DatabaseName NVARCHAR(128);
DECLARE @MdfPath NVARCHAR(255);
DECLARE @LdfPath NVARCHAR(255);
DECLARE @Sql NVARCHAR(MAX);

-- 確保基礎路徑結尾無斜線
IF RIGHT(@BasePath, 1) = '\'
    SET @BasePath = LEFT(@BasePath, LEN(@BasePath) - 1);

-- 開始遍歷資料庫清單
DECLARE db_cursor CURSOR FOR
SELECT DatabaseName FROM @DatabaseList;

OPEN db_cursor;

FETCH NEXT FROM db_cursor INTO @DatabaseName;

WHILE @@FETCH_STATUS = 0
BEGIN
    -- 生成 MDF 和 LDF 的路徑
    SET @MdfPath = @BasePath + '\' + @DatabaseName + '.mdf';
    SET @LdfPath = @BasePath + '\' + @DatabaseName + '_log.ldf';

    -- 修改 MDF 檔案位置
    SET @Sql = 
        'ALTER DATABASE ' + QUOTENAME(@DatabaseName) + 
        ' MODIFY FILE (NAME = ''' + @DatabaseName + ''', FILENAME = ''' + @MdfPath + ''')';
    EXEC sp_executesql @Sql;

    -- 修改 LDF 檔案位置
    SET @Sql = 
        'ALTER DATABASE ' + QUOTENAME(@DatabaseName) + 
        ' MODIFY FILE (NAME = ''' + @DatabaseName + '_log'', FILENAME = ''' + @LdfPath + ''')';
    EXEC sp_executesql @Sql;

    -- 將資料庫設為 ONLINE
    SET @Sql = 
        'ALTER DATABASE ' + QUOTENAME(@DatabaseName) + ' SET ONLINE';
    EXEC sp_executesql @Sql;

    -- 繼續處理下一個資料庫
    FETCH NEXT FROM db_cursor INTO @DatabaseName;
END;

-- 關閉並釋放資源
CLOSE db_cursor;
DEALLOCATE db_cursor;



2024年12月10日 星期二

gitk 圖形介面中的代碼比較亂碼

gitk 圖形介面中的代碼比較亂碼

裡面亂碼最後查到可以從 gitconfig 中設置,可以直接設置在全域也可以直接設置在專案資料夾,這邊如果你不確定怎麼做的話跟著底下教學儲存在專案設置就行。

為什麼會造成這個原因是,git 雖然是用 utf8 儲存,但是讀取的時候是根據電腦語言編碼解析的,也就是在中文 Windows 上預設會被使用 big-5 解碼。


解決方案

關鍵的設置指令是

[gui]
    encoding = utf-8

直接貼到專案資料夾中 .git\config 就可以起作用了


或是執行下面的指令 (消除 —local 會儲存到使用者全域設定)

git config --local gui.encoding utf-8


然後透過下面的指令查看

# Linux
git conig --local --list | grep gui.encoding

# pwsh
git config --local --list | Select-String "gui.encoding"

再重新打開 gitk 就可以正確的識別了



2024年12月3日 星期二

git 如何通過 ssh 將倉庫 push pull 到 Windwos 系統上

git 如何通過 ssh 將倉庫 push pull 到 Windwos 系統上

首先 ssh 先自行打通無密碼連接或是有密碼也無所謂每次都要打而已

然後對於設置remote的路徑是這樣的

# 相對路徑
git@192.168.1.1:myproject.git

# 絕對路徑
git@192.168.1.1:/C:/myproject.git

這是一個裸庫,雖然沒限定只是遠端的庫建議別用非裸庫,不然有時候工作目錄的檔案動到就無法操作了。

使用者我是創了一個 git 的使用者,所以才是git開頭。

最後面的路徑是相路徑,相對於該使用者的使用者文件底下。

然後就是問題所在了,git長年來並沒有處理在windwos下無法使用的問題,解法我是查到這篇

https://superuser.com/questions/1841373/how-do-i-clone-from-local-git-repositories-with-ssh

簡單說你就在使用者文件底下建立兩個文件

git-upload-pack.cmd

@"C:\Program Files\Git\bin\sh" -c "'/c/Program Files/Git/bin/git' upload-pack %*"

git-receive-pack.cmd

@"C:\Program Files\Git\bin\sh" -c "'/c/Program Files/Git/bin/git' receive-pack %*"

這樣就能修好了,如果你的git不是標準安裝,路徑在自己改一下
如果不想放在使用者文件底下,記得自己設置一下環境變數

2024年11月29日 星期五

Vscode 手動指定 PowerShell 位置

Vscode 手動指定 PowerShell 位置

適用場景是如果要完全使用可攜板的 VsCode ,需要手動從設定中指定。大概就是企業環境中禁止管理權限無法安裝的一個折衷做法。

下面的範例是下載 Protable 的 VsCode 然後直接把 pwsh 放置在同資料夾的 data 中

    "powershell.powerShellAdditionalExePaths": {
        "PowerShell (x64)": "VSCodeProtable\\data\\PowerShell\\7\\pwsh.exe"
    },
    "[powershell]": {
        "editor.defaultFormatter": "ms-vscode.powershell"
    },
    "powershell.powerShellDefaultVersion": "PowerShell (x64)",
    "powershell.promptToUpdatePowerShell": false,

這樣就可以從內部讀取到並使用 pwsh 了

2024年11月15日 星期五

linux 編譯 OpenSSL 安裝到 opt 文件中

linux 編譯 OpenSSL 安裝到 opt 文件中

安裝到 opt 中是為了避免對系統造成影響

# 下載並編譯 OpenSSL 庫
cd /tmp
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
./config --prefix=/opt/openssl-1.1.1 shared
make -j$(nproc)
sudo make install

# 臨時載入必要的環境變數
export LD_LIBRARY_PATH="/opt/openssl-1.1.1/lib"
export CPPFLAGS="-I/opt/openssl-1.1.1/include"
export LDFLAGS="-Wl,-rpath,/opt/openssl-1.1.1/lib -L/opt/openssl-1.1.1/lib"
export PATH="/opt/openssl-1.1.1/bin:$PATH"
openssl version


選這個版本是因為這是 python311 要求的最低版本,新版本的要編譯可能會卡到更多的依賴,需求夠用就好。


最新版本 3.4.0 版

# 需要的依賴
sudo yum install perl-IPC-Cmd -y

# 下載並編譯 OpenSSL 庫
cd /tmp
wget https://www.openssl.org/source/openssl-3.4.0.tar.gz
tar xzf openssl-3.4.0.tar.gz
cd openssl-3.4.0
./config --prefix=/opt/openssl-3.4.0 shared
make -j$(nproc)
sudo make install

# 臨時載入必要的環境變數
export LD_LIBRARY_PATH="/opt/openssl-3.4.0/lib64"
export CPPFLAGS="-I/opt/openssl-3.4.0/include"
export LDFLAGS="-Wl,-rpath,/opt/openssl-3.4.0/lib64 -L/opt/openssl-3.4.0/lib64"
export PATH="/opt/openssl-3.4.0/bin:$PATH"
openssl version



2024年11月6日 星期三

PowerShell 如何捕捉 cmdlet 中 Write-Host 的信息到變數上

PowerShell 如何捕捉 cmdlet 中 Write-Host 的信息到變數上

在 PS 中通道其實是有屬於 PS 內自訂的通道, Write-Host 是 6 號通道

所以其實只要把 6 號轉換到 1 號就可以獲取了

function WriteTestMessage {
    Write-Host "這是使用 Write-Host 輸出的測試消息。"
}
$msg = WriteTestMessage 6>&1
Write-Host "msg = $msg"


其他通道的用處

1: Success (成功輸出)

2: Error (錯誤)

3: Warning (警告)

4: Verbose (詳細資訊)

5: Debug (除錯)

6: Information (資訊)


如果要個別獲取貌似只能重新定向到個別檔案上,無法透過 6>$msg 定向到變數獲取

例如 WriteTestMessage 6>"a.txt" 2>"b.txt" 這樣的寫法會直接輸出到檔案上。



這裡比較坑人的是 PS 有自己的流,這裡我先把他稱作為 PS流,與之相似的是與外部程式互動的,我們直接在終端看到的那個我把它稱為 Console流

PS中會同時出現兩種流的,當你呼叫一個外部程式那個外部程式產生的 stderr 是屬於 Console流 而不是 PS流

這不是在繞你啊,舉例來說下面的代碼

$stderr = App.exe 2>&1

嘗試獲取外部的 stderr 但實際上代碼中的 2>&1 所控制的是PS流,所以你啥也拿不到因為外部程式輸出的是Console流

如何獲取 Console流 中的 stderr 解法請參照這篇 CHG: PowerShell 如何捕捉 StdErr 通道的錯誤信息流 的 Invoke-CommandInfo 函式