R 如何管理git存储库外部的本地文件路径,而不因协作者上不同路径的冲突而造成混乱;机器?
我经常使用git和统计软件(如R)在大型数据分析项目上进行协作。因为数据集非常大,在重新下载时可能会发生变化,所以我们不会将它们保存在存储库中。虽然我们喜欢设计我们开发的脚本的最终版本,以使用命令行参数读取原始数据集的路径,但是通过直接将文件读取到R环境中,测试和调试更容易。因此,随着我们的发展,我们最终会有这样的产品线R 如何管理git存储库外部的本地文件路径,而不因协作者上不同路径的冲突而造成混乱;机器?,r,git,version-control,path,collaboration,R,Git,Version Control,Path,Collaboration,我经常使用git和统计软件(如R)在大型数据分析项目上进行协作。因为数据集非常大,在重新下载时可能会发生变化,所以我们不会将它们保存在存储库中。虽然我们喜欢设计我们开发的脚本的最终版本,以使用命令行参数读取原始数据集的路径,但是通过直接将文件读取到R环境中,测试和调试更容易。因此,随着我们的发展,我们最终会有这样的产品线 something = read.raw.file("path/to/file/on/my/machine") #something = read.raw.file("path
something = read.raw.file("path/to/file/on/my/machine")
#something = read.raw.file("path/to/file/on/collaborators/machine")
#something = read.raw.file("path/to/file/on/other/collaborators/machine")
把代码弄乱了
一定有更好的办法。我尝试添加每个脚本在运行前读取的文件,例如
proj-config.local
path.to.raw.file.1 = "/path/to/file/on/my/machine"
并将其添加到.gitignore
,但这是一个“重量级”的解决方案,考虑到它需要多少时间,而且对于协作者来说,这样做或应该这样做并不明显,或者他们可能会以不同的方式命名或定位文件(因为它被忽略),因此读取该文件的共享代码行最终会出错,等等
是否有更好的方法来管理本地外部回购路径/参考
PS我没有注意到在这些相关问题中有任何关于这个问题的内容:
在从两个不同平台处理同一个repo时,我遇到了类似的情况,同时在每台机器上的repo外部存储数据文件。您可以做的一件事是让每个人将文件保存在相对于项目工作目录的特定位置 有了这些知识,您可以在每个会话开始时构建路径。例如:
path <- strsplit(getwd(), "project_directory")[[1]]
path <- file.path(path, "data_directory", "file")
something <- read.raw.file(path)
path我在两个不同平台的同一个repo上工作时遇到过类似的情况,同时在每台机器上的repo外部存储数据文件。您可以做的一件事是让每个人将文件保存在相对于项目工作目录的特定位置
有了这些知识,您可以在每个会话开始时构建路径。例如:
path <- strsplit(getwd(), "project_directory")[[1]]
path <- file.path(path, "data_directory", "file")
something <- read.raw.file(path)
path我一直在使用的一个解决方案是建立一个搜索路径的概念,它可以用来定位文件。在一个特定的应用程序中,我内置了使用环境变量覆盖搜索路径的功能,类似于常用的path
变量
我编写了一个函数,findFileInPath
(如下),它将搜索提供的路径并返回找到的任何路径。它接受一个路径向量,并允许您像操作系统一般那样通过特定的字符来分离片段
您可以这样使用它:(仅作为示例)
我使用类似的方法来定位文件到源
,定位配置文件、数据集等。我有多个不同的路径,其中一些路径暴露在环境中或各种配置文件中,其他路径只是内部路径。它工作得很好
在上面的示例中,DATASEARCHPATH
环境变量可以设置为(在R之外)以冒号分隔的一系列要搜索的路径
我的findFileInPath
实现默认搜索系统的PATH环境变量,以冒号字符分隔。(这可能不适用于Windows。我只在Mac和Linux上使用。)
我一直在使用的一个解决方案是建立一个搜索路径的概念,它可以用来定位文件。在一个特定的应用程序中,我内置了使用环境变量覆盖搜索路径的功能,类似于常用的path
变量
我编写了一个函数,findFileInPath
(如下),它将搜索提供的路径并返回找到的任何路径。它接受一个路径向量,并允许您像操作系统一般那样通过特定的字符来分离片段
您可以这样使用它:(仅作为示例)
我使用类似的方法来定位文件到源
,定位配置文件、数据集等。我有多个不同的路径,其中一些路径暴露在环境中或各种配置文件中,其他路径只是内部路径。它工作得很好
在上面的示例中,DATASEARCHPATH
环境变量可以设置为(在R之外)以冒号分隔的一系列要搜索的路径
我的findFileInPath
实现默认搜索系统的PATH环境变量,以冒号字符分隔。(这可能不适用于Windows。我只在Mac和Linux上使用。)
让每个人都将其本地计算机上的存储库保持在与感兴趣的文件相关的相同位置,并使用相对路径而不是完整路径如何?此外,只需添加一次“工作目录根”命令行选项或环境变量,它可以覆盖具有特定需求的用户的默认根目录。让每个人都将其本地计算机上的存储库保持在与感兴趣的文件相关的相同位置,并使用相对路径而不是完整路径如何?此外,添加“工作根目录”也很简单命令行选项或环境变量一次,可以覆盖具有特定需求的用户的默认根目录。这是一个有趣的想法。我要继续努力,尝试一下,然后回来汇报。谢谢到目前为止,这是很好的工作。谢谢这是一个有趣的想法。我要继续努力,尝试一下,然后回来汇报。谢谢到目前为止,这是很好的工作。谢谢嗯,好主意。我同意这在某些情况下可能有效,但我通常反对对移动/尤其是重命名文件夹如此敏感的解决方案。理想情况下,脚本(以及整个回购协议)不应该真正关心它的位置,你不这么认为吗?我承认我有点不公平地允许它非常关心另一个文件的位置
#' findFileInPath: Locates files by searching the supplied paths
#'
#' @param filename character: the name of the file to search for
#'
#' @param path character: the path to search, either a vector, or optionally
#' separated by \code{sep}.
#'
#' @param sep character: the separator character used to split \code{path}
#' into multiple components.
#'
findFileInPath = function(filename, path=c('.',Sys.getenv('PATH')), sep=':') {
# List all potential files, and return only those which exist.
files = data.frame(name=file.path(unlist(strsplit(path, sep)), filename),
stringsAsFactors=FALSE)
files$exist = file.exists(files$name)
files[files$exist==TRUE,1]
}