2010-11-09 56 views
14

有沒有辦法檢查遠程中是否存在指定的相對路徑下的文件?如果它是唯一的選擇,我很好地提取信息。換句話說,我正在尋找具有指定遠程和分支的選項的git-ls-files。我只是有興趣,如果該文件存在(文件在樹枝上的列表也將這樣做),我不關心哈希值,diff文件等如何檢查遠程文件是否存在?

回答

22

您可以使用

git cat-file -e <remote>:<filename> 

這將文件存在時以零退出。而不是上面的<remote>,你會使用遠程分支名稱(但實際上它可以是任何tree-ish對象引用)。要使用這樣一個遠程分支,您需要配置和提取遠程存儲庫(即使用git remote add + git fetch)。

一個具體的例子:

$ git cat-file -e origin/master:README && echo README exists 
README exists 

$ git cat-file -e origin/master:FAILME 
fatal: Not a valid object name origin/master:FAILME 

有兩點需要注意:

  • 使用/作爲文件名路徑分隔符,即使是在如視窗。
  • <filename>是相對於存儲庫根目錄的完整路徑(如foo/bar/README)。
+1

通過''你說的是遠程分支,這意味着您必須進行配置遠程並首先運行'git fetch ';你正在檢查你的回購中的遠程分支,所以你需要確保它是最新的。 – Cascabel 2010-11-09 15:07:21

+0

準確地說,謝謝。我將其納入答案。 – earl 2010-11-09 15:18:36

6

您可以使用git archive訪問單個文件,而無需下載庫的任何其他部分:

if git archive --format=tar \ 
       --remote=<remote_name-or-URL> master README >/dev/null; then 
    echo 'master has README' 
else 
    echo 'master does not have README (or other error)' 
fi 

歸檔服務(upload-archive)可能不是所有的服務器或存儲庫上啓用但是,你將有以測試您需要訪問的服務器和存儲庫。

如果存檔服務不可用,則必須通過常規方式獲取對象。

如果您還沒有遠程設置存儲庫,您可以對FETCH_HEAD執行「淺」訪存(這需要在Git存儲庫中完成,但它可以完全不相關或甚至空):

git fetch --depth=1 remote_name-or-URL master 
if git rev-parse --verify --quiet FETCH_HEAD:README >/dev/null; then 
    echo "repository's master has README" 
else 
    echo "repository's master does not have README" 
fi 

如果你有一個遠程存儲庫定義的,那麼你可能只是想更新,並通過正常的遠程跟蹤分支訪問文件:

git fetch remote_name 
if git rev-parse --verify --quiet remote_name/master:README >/dev/null; then 
    echo "remote's master has README" 
else 
    echo "remote's master does not have README" 
fi 
+0

好東西!真的有幫助 – 2012-06-21 07:40:42

+1

被警告:'git-archive'解決方案不能可靠工作。它似乎只檢查是否存在頂級文件/目錄,例如:'git archive --remote = master dir-that-exist/then/some/nonsense/path'會以0退出 – 2015-04-16 13:02:26