6

つまり、Github でホストされているファイルの最終変更日を取得する必要があります。

要するに、Github に時々更新されるファイル (R ワークスペース) があることを考えると、ローカル ファイルがレポ内のファイルよりも古いかどうかを確認する関数を R に作成したいと思います (興味がありますが、私の動機はこの投稿の最後に公開されています)。これが私が話しているファイルです。

すべてのファイルにはそれに関連付けられた履歴ページがあるため、原則としては多少簡単なはずですが、これをどうするかを知るには私の知識があまりにも貧弱です. また、この Qは、php を使用して私がやりたいことを行う方法を示唆しているようですが、それは私にとって本当に無知なので、何らかの形で役立つかどうかはわかりません。

したがって、この投稿の短いバージョンで述べたように、このファイルの最後のコミットの日付を取得する方法を見つける必要があります。その後、ローカルファイルのコミット日付と比較する方法を見つけることができます。

前もって感謝します、フアン

動機: 私は R の基本のオンライン コースで作業しています。このコースでは、演習の解決策が正しいかどうかを自己チェックするためのシステムを使用しています (つまり、学生はすぐに結果を確認できます)。このシステムは、バグや新しい問題を見つけることが多いため、定期的に更新される関数とデータを含むファイルを使用します。したがって、私の目標は、利用可能な新しいファイルがあるかどうかを学生に伝える機能を持つことです。それをダウンロードして古いものを置き換える方法を見つけることも素晴らしいことですが、それは今では二次的なことです.

4

3 に答える 3

3

問題は、ダウンロードの git-time を維持することです。以下の解決策は、次のチェックのために、各ダウンロード後にファイル時間を Git 日付に設定します。

library(RCurl)
library(rjson)
destination = "datos" # assume current directory
repo = "https://api.github.com/repos/jumanbar/Curso-R/"
path = "ejercicios-de-programacion/rep-3/datos"
myopts = curlOptions(useragent="whatever",ssl.verifypeer=FALSE)

d = fromJSON(getURL(paste0(repo,"commits?path=",path),
                useragent="whatever",ssl.verifypeer=FALSE))[[1]]
gitDate  = as.POSIXct(d$commit$author$date)
MustDownload = !file.exists(destination) |  file.info(destination)$mtime > gitDate
if (MustDownload){
  url = d$url
  commit = fromJSON(getURL(url, .opts=myopts))
  files = unlist(lapply(commit$files,"[[","filename"))
  rawfile = commit$files[[which(files==path)]]$raw_url
  download.file(rawfile,destination,quiet=TRUE)
  Sys.setFileTime(destination,gitDate)
  print("File was downloaded")
}

R からは useragent と ssl.verifypeer が必要なようです。コマンドラインなしで動作します。あなたがセキュリティを意識しているなら、その件に関するドキュメントがあちこちに出回っていますが、私は簡単な方法でコミットしました.

于 2013-05-16T09:18:48.897 に答える
2

github リポジトリのローカル クローンが必要なようです。今のところ R の言語仕様を忘れて (私は R を知りません)、git では、 を介してさまざまな方法で最新の日付を取得できますgit loggit logヘルプ ファイル ( )のgit help log[プレースホルダー] セクションから:

%cd: committer date
%cD: committer date, RFC2822 style
%cr: committer date, relative
%ct: committer date, UNIX timestamp
%ci: committer date, ISO 8601 format

git log次のコマンドを使用して、ファイルの最新のコミットの UNIX タイムスタンプ (1970 年 1 月 1 日開始からの秒数 - 非常に簡単に比較可能) をプロジェクト ルートから取得できます。

git log --format=%ct -1 -- ejercicios-de-programacion/rep-3/datos

これは、1368691710 などの数値を返しますが、リストされている他の形式も使用できます。

あとは、プロジェクト ルートを作業ディレクトリとして、R からこのシステム コールを実行する方法を見つける必要があります。この SO 投稿が役立つ場合があります (ただし、R は使用しません)。

于 2013-05-16T08:21:45.687 に答える
0

おそらく、「git status」コマンド (新しいコミットがあるかどうかを通知します) を cronjobs と組み合わせて使用​​できます。ただし、これにはローカル クローンが必要です。また、cronjob 内でコマンドの出力を使用しようとしたことはありません。

于 2013-05-16T12:16:21.800 に答える