簡體   English   中英

如何 git checkout 特定目錄並刪除該目錄的路徑?

[英]How do I git checkout a specific directory and strip the path to that directory?

我有一個單聲道存儲庫,想將路徑中的所有文件檢出到我的 Web 服務器上的目錄中。

我知道我可以通過執行以下操作來簽出目錄: git checkout origin/master -- path/to/directory ,但這給了我path/to/directory

我想要我當前目錄中來自遠程目錄的結帳文件。 所以我嘗試了git --work-tree=. checkout origin/master -- path/to/directory git --work-tree=. checkout origin/master -- path/to/directory 但這不會改變輸出目錄路徑。

現在,我只是移動文件,但這很快就會變得乏味( mv path/to/directory/* . )。 有可以幫助我的 git 命令嗎?

這個問題類似於這個未回答的問題: Git checkout to specific directory

我會寫一個腳本checkout_git_dir_and_move_file_here.sh

git checkout origin/master -- $1
mv $1/* .
rmdir -p $1

並將其放在~/bin 然后你可以從任何地方調用它。

Git 是一個命令行工具,所以編寫 shell 腳本來處理這樣的事情是很自然的。 許多更復雜的 git 任務需要顯式腳本。

雖然 Git 可以用作部署工具,但還有更好的選擇。 但是,我們將 Git 用於一個非常相似的任務,它應該適合您。 但是,這假設您的目的只是“簽出”文件,而不是將更改提交回存儲庫。

在我們的例子中,我們有一個存儲庫,其中包含用於不同類型測試服務器的 Bash、Perl 和其他腳本的集合。 由於相似性和理智的緣故,我們將它們保存在每個服務器的單獨目錄下的一個存儲庫中,而不是每個服務器的存儲庫。

為了在給定的服務器上部署腳本,比如ServerA ,我們最初在本地創建存儲庫的鏡像克隆。

cd /opt/repos
git clone --mirror https://repo.mycompany.com/git/admin_repo

在將更改提交到主存儲庫時更新鏡像執行如下:

cd /opt/repos/admin_repo.git
git fetch --all

對於此服務器和其他服務器,腳本位於/usr/local/cscripts 要提取 ServerA 的腳本,這些腳本包含在server_a/cscripts下的存儲庫server_a/cscripts ,請使用以下命令

cd /usr/local/cscripts
rm -rf *
git archive --remote=/opt/repos/admin_repo.git HEAD:server_a/cscripts | tar -x

本質上,生成的 tarball 會立即解壓縮到當前目錄中,而無需考慮存儲庫的路徑。 這不是一個完美的解決方案,因為文件名或子目錄布局的更改不會自動應用,因此rm --rf以確保空白。

編輯:我沒有提到我們使用存儲庫的鏡像,因為我們當前的存儲庫服務器僅使用簡單的 HTTPS,不支持git:或 smart-HTTPS。 如果您的存儲庫已經在本地或在更好的存儲庫服務器上維護,您可以直接提取檔案而無需鏡像。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM