指定された相対パスの下にあるファイルがリモートに存在するかどうかを確認する方法はありますか? それが唯一のオプションである場合は、最初に情報を取得しても問題ありません。つまり、リモートとブランチを指定するオプションを備えた git-ls-files を探しています。ファイルが存在する場合にのみ関心があります (ブランチ上のファイルのリストも同様です)。ハッシュや差分などは気にしません。
2 に答える
使用できます
git cat-file -e <remote>:<filename>
ファイルが存在する場合、ゼロで終了します。上記の代わりに<remote>
、リモート ブランチ名を使用します (ただし、実際にはツリー風のオブジェクト参照である可能性があります)。このようなリモート ブランチを使用するには、リモート リポジトリを構成してフェッチする必要があります (つまり、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
2 つの注意事項:
/
Windows などでも、ファイル名のパス区切り文字として使用します。<filename>
foo/bar/README
リポジトリのルートを基準とした絶対パス ( など) です。
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