一起使用Git和Dropbox有效?

如何有效地将Git和Dropbox一起使用?

我认为Dropbox上的Git很棒。 我一直使用它。 我有多台电脑(两台在家,一台在工作),我使用Dropbox作为中央裸存储库。 由于我不想将其托pipe在公共服务上,而且我无法访问始终可以ssh访问的服务器,因此Dropbox通过在后台同步(非常快)来解决此问题。

安装程序是这样的:

~/project $ git init ~/project $ git add . ~/project $ git commit -m "first commit" ~/project $ cd ~/Dropbox/git ~/Dropbox/git $ git init --bare project.git ~/Dropbox/git $ cd ~/project ~/project $ git remote add origin ~/Dropbox/git/project.git ~/project $ git push -u origin master 

从那里,你可以克隆你已经与你的Dropbox帐户相关联的~/Dropbox/git/project.git (或者与人共享这个目录),你可以完成所有正常的Git操作,并将它们同步到你的所有其他机器自动。

我在推理上写了一篇关于版本控制的博客文章( 旧链接 已经死了 ),以及如何设置我的环境,这是基于我的Ruby on Rails开发经验,但它可以应用于任何事情。

这个答案是基于Mercurial的经验,而不是Git,但是这个经验表明,使用Dropbox这种方式是要求腐败的存储库,如果甚至有机会在不同的时间从不同的机器更新同一个基于Dropbox的存储库(Mac, Unix,Windows在我的情况)。

我没有一个可以出错的事情的完整列表,但是这里有一个具体的例子让我困惑。 每台机器都有自己的换行符的概念,以及如何处理文件名中的大写/小写字符。 Dropbox和Git / Mercurial处理这个略有不同(我不记得确切的区别)。 如果Dropbox更新Git / Mercurial背后的存储库,那么presto,破坏的存储库。 这种情况会立即发生,并且不可见,所以你甚至不知道你的版本库是否被破坏,直到你试图从中恢复。

从这样一堆乱七八糟的东西中挖出来之后,我一直在使用下面的配方,取得了巨大的成功,没有出现任何问题。 只需将您的存储库移出Dropbox。 使用Dropbox的一切; 文档, JAR文件 ,任何你喜欢的。 并使用GitHub (Git)或Bitbucket (Mercurial)来pipe理存储库本身。 两者都是免费的,所以这没有增加任何成本,每个工具现在发挥其优势。

在Dropbox之上运行Git / Mercurial除了风险之外没有其他任何东西。 不要这样做。

正确的方法是使用git-remote-dropbox: https : //github.com/anishathalye/git-remote-dropbox

在Dropbox中创build您自己的裸回购会导致很多问题。 Anish(图书馆的创始人) 最好地解释说 :

这些问题的根本原因是,Dropbox桌面客户端devise用于同步文件,而不是Git存储库。 如果没有对Git仓库的特殊处理,它不会像Git那样保持相同的保证。 远程仓库上的操作不再是primefaces操作,并发操作或不正确的同步操作可能导致仓库损坏。

传统的Git远程在服务器端运行代码,使其正常工作,但我们不能这样做。

解决scheme:可以正确解决这个问题。 即使在有多个用户和并发操作的情况下,也可以将Git与Dropbox一起使用,并具有与传统Git远程控制相同的安全性和一致性保证!

对于用户来说,就像使用git-remote-dropbox一样简单,git-remote-dropbox是一个Git远程助手,充当Git和Dropbox之间透明的双向桥梁,并保持传统Git远程的所有保证。 使用共享文件夹甚至是安全的,所以它可以用于协作(yay无限的私人回购协议与无限的合作者!)。

使用远程助手,可以使用Dropbox作为Git Remote,并继续使用所有常规的Git命令,例如git clone,git pull和git push,并且所有内容都将按预期工作。

我不认为使用Git和Dropbox是最好的办法…只要想一想两者的特点:

Git的方法:

  • 允许你有一个中央存储库
  • 允许您拥有自己的存储库,并进行自己的更改
  • 允许您发送和接收来自中央存储库的更改
  • 允许多人更改相同的文件,并将它们合并或要求您合并它们,如果它不能这样做
  • Web和桌面客户端允许访问中央存储库

Dropbox的:

  • 将所有内容保存在中央存储库中
  • 允许您在服务器中拥有自己的文件版本
  • 强制您发送和接收来自中央存储库的更改
  • 如果多人更换相同的文件,第一个提交的文件被replace为后来的提交,并且没有合并发生,这是麻烦的(并且肯定是它最大的缺点)
  • Web和桌面客户端允许访问中央存储库。

如果你担心分享一些文件,为什么不encryption呢? 然后你可以得到Dropbox的最大优势Git,也就是有公共和私人文件…

我不想把所有的项目都放在一个Git仓库中,也不想把每个项目的代码都运行起来,所以我做了一个Bash脚本来自动执行这个过程。 你可以在一个或多个目录中使用它 – 所以它可以在这个post中为你做代码,或者它可以在多个项目中一次完成。

 #!/bin/sh # Script by Eli Delventhal # Creates Git projects for file folders by making the origin Dropbox. You will need to install Dropbox for this to work. # Not enough parameters, show help. if [ $# -lt 1 ] ; then cat<<HELP projects_to_git.sh -- Takes a project folder and creates a Git repository for it on Dropbox USAGE: ./projects_to_git.sh file1 file2 .. EXAMPLES: ./projects_to_git.sh path/to/MyProjectDir Creates a git project called MyProjectDir on Dropbox ./projects_to_git.sh path/to/workspace/* Creates a git project on Dropbox for every folder contained within the workspace directory, where the project name matches the folder name HELP exit 0 fi # We have enough parameters, so let's actually do this thing. START_DIR=$(pwd) # Make sure we have a connection to Dropbox cd ~ if [ -s 'Dropbox' ] ; then echo "Found Dropbox directory." cd Dropbox if [ -s 'git' ] ; then echo " Dropbox Git directory found." else echo " Dropbox Git directory created." mkdir git fi else echo "You do not have a Dropbox folder at ~/Dropbox! Install Dropbox. Aborting..." exit 0 fi # Process all directories matching the passed parameters. echo "Starting processing for all files..." for PROJ in $* do if [ -d $PROJ ] ; then PROJNAME=$(basename $PROJ) echo " Processing $PROJNAME..." # Enable Git with this project. cd $PROJ if [ -s '.git' ] ; then echo " $PROJNAME is already a Git repository, ignoring..." else echo " Initializing Git for $PROJNAME..." git init -q git add . git commit -m "Initial creation of project." -q # Make the origin Dropbox. cd ~/Dropbox/git if [ -s $PROJNAME ] ; then echo " Warning! $PROJNAME already exists in Git! Ignoring..." else echo " Putting $PROJNAME project on Dropbox..." mkdir $PROJNAME cd $PROJNAME git init -q --bare fi # Link the project to the origin echo " Copying local $PROJNAME to Dropbox..." cd $PROJ git remote add origin "~/Dropbox/git/$PROJNAME" git push -q origin master git branch --set-upstream master origin/master fi fi done echo "Done processing all files." cd $START_DIR 

关于使用Dropbox的小团队:

如果每个开发人员在Dropbox上都有自己的可写入裸仓库,而这个仓库仅供其他开发人员使用,那么这有助于代码共享,而不会有损坏的风险!

那么如果你想要一个集中的“主线”,你可以让一个开发者从自己的回购库中pipe理所有的东西。

现在是2015年,截至三天前,已经创build了一个基于Dropbox API v2的新工具 ,以便在Dropbox上安全地使用git。 它针对API而不是使用桌面客户​​端,并正确处理多个同时推送到共享文件夹中托pipe的存储库。

一旦configuration完成,它就可以像其他任何git remote一样设置git remote。

 git clone "dropbox::/path/to/repo" git remote add origin "dropbox::/path/to/repo" 

我一直以推荐的方式使用Mercurial,并强烈build议您保持谨慎,特别是如果有任何不同的机器。 Dropbox论坛充满了对神秘的文件名问题的自发性的抱怨。 Hg(我假设Git)在例行检查中不会注意或抱怨,当您尝试使用它时,您只会在投诉腐败回购时听到腐败消息。 坏消息。 希望我能对这个问题及其解决方法更具体一些; 我仍然试图从这个混乱中挖掘自己。

我喜欢Dan McNevin的回答! 我现在也一起使用Git和Dropbox,并且在我的.bash_profile中使用了几个别名,所以我的工作stream程如下所示:

 ~/project $ git init ~/project $ git add . ~/project $ gcam "first commit" ~/project $ git-dropbox 

这些是我的别名:

 alias gcam='git commit -a -m' alias gpom='git push origin master' alias gra='git remote add origin' alias git-dropbox='TMPGP=~/Dropbox/git/$(pwd | awk -F/ '\''{print $NF}'\'').git;mkdir -p $TMPGP && (cd $TMPGP; git init --bare) && gra $TMPGP && gpom' 

我使用Mercurial(或Git)+ TrueCrypt + Dropbox进行encryption的远程备份

最酷的事情是,如果您修改了一小部分代码,Dropbox不会同步整个TrueCrypt容器。 同步时间大致与更改量成正比。 即使它被encryption,TrueCrypt + Dropbox的组合使用块encryption+块级同步的优秀使用。

其次,单一的encryption容器不仅增加了安全性,而且还减less了存储库损坏的可能性。

小心:但是在Dropbox运行时,您必须非常小心未安装容器。 如果两个不同的客户端向容器签入不同的版本,解决冲突也是一种痛苦。 所以,只有一个人用它来备份,而不是一个团队是实用的。

build立:

  • 创build一个Truecrypt容器(多个Gigabyte是好的)
  • 在Truecrypt首选项下,取消选中preserve modification timestamp *。
  • 创build一个如上所述的回购(Dan)( https://stackoverflow.com/a/1961515/781695

用法:

  • 退出Dropbox
  • 安装容器,推送您的更改,卸载
  • 运行dropbox

PS取消选中preserve modification timestamp告诉dropbox文件已被修改,应该同步。 请注意,即使您不更改其中的任何文件,安装容器也会修改时间戳。 如果您不希望发生这种情况,只需将该卷挂载为read-only

我们使用这种方法(在Dropbox中创build一个裸存储库)在共享文件夹上

一小部分开发人员可以从该裸露的同步存储库中提取并创build本地克隆。 一旦工作完成,我们就会推回原点。

有一件事我错过了一个很好的方法,一旦推送到原点发送电子邮件与变更集信息。 我们正在使用Google Wave手动跟踪更改。

还有一个开源项目(一系列跨平台的[Linux,Mac,Win]脚本),用一些(3-4)命令完成存储库pipe理的所有细节。

https://github.com/karalabe/gitbox/wiki

示例用法是:

 $ gitbox create myapp Creating empty repository... Initializing new repository... Repository successfully created. $ gitbox clone myapp Cloning repository... Repository successfully cloned. 

之后正常的git用法:

 $ echo “Some change” > somefile.txt $ git add somefile.txt $ git commit –m “Created some file” $ git push 

检查项目wiki和手册以获取完整的命令参考和教程。

我将我的非Github回购存储在Dropbox上。 我遇到的一个警告是重新安装后同步。 Dropbox将在下载最小的文件之前,移动到较大的。 不是一个问题,如果你晚上开始,并在周末后回来:-)

我的线程 – http://forums.dropbox.com/topic.php?id=29984&replies=6

我喜欢Dan McNevin的最高票数的答案。 我最终做了很多次git命令,决定做一个脚本。 所以这里是:

 #!/bin/bash # Usage usage() { echo "Usage: ${0} -m [ master-branch-directory ] -r [ remote-branch-directory ] [ project-name ]" exit 1 } # Defaults defaults() { masterdir="${HOME}/Dropbox/git" remotedir="${PWD}" gitignorefile="# OS generated files #\n\n.DS_Store\n.DS_Store?\n.Spotlight-V100\n.Trashes\nehthumbs.db\nThumbs.db" } # Check if no arguments if [ ${#} -eq 0 ] ; then echo "Error: No arguments specified" usage fi #Set defaults defaults # Parse arguments while [ ${#} -ge 1 ]; do case "${1}" in '-h' | '--help' ) usage ;; '-m' ) shift masterdir="${1}" ;; '-r' ) shift remotedir="${1}" ;; * ) projectname="${1##*/}" projectname="${projectname%.git}.git" ;; esac shift done # check if specified directories and project name exists if [ -z "${projectname}" ]; then echo "Error: Project name not specified" usage fi if [ ! -d "${remotedir}" ]; then echo "Error: Remote directory ${remotedir} does not exist" usage fi if [ ! -d "${masterdir}" ]; then echo "Error: Master directory ${masterdir} does not exist" usage fi #absolute paths remotedir="`( cd \"${remotedir}\" && pwd )`" masterdir="`( cd \"${masterdir}\" && pwd )`" #Make master git repository cd "${masterdir}" git init --bare "${projectname}" #make local repository and push to master cd "${remotedir}" echo -e "${gitignorefile}" > .gitignore # default .gitignore file git init git add . git commit -m "first commit" git remote add origin "${masterdir}/${projectname}" git push -u origin master #done echo "----- Locations -----" echo "Remote branch location: ${remotedir}" echo "Master branch location: ${masterdir}" echo "Project Name: ${projectname}" 

该脚本只需要一个项目名称。 它将在~/Dropbox/git/下以指定名称生成一个git仓库,并将当前目录的全部内容推送到新创build的原始主分支。 如果给出多个项目名称,则使用最右侧的项目名称参数。

可选地,-r命令参数指定将推送到原点主控的远程分支。 项目源主机的位置也可以用-m参数指定。 一个默认的.gitignore文件也被放置在远程分支目录中。 脚本中指定了目录和.gitignore文件的默认值。

现在在2014年,我一直在使用Git和Dropbox约一年半没有问题。 但是有一些观点:

  • 我所有使用Dropbox的机器都在Windows上,不同的版本(7到8)+ 1个mac。
  • 我不与其他人共享资源库,所以我是唯一一个修改它的人。
  • git push推送到一个远程仓库,所以如果它被破坏,我可以很容易地恢复它。
  • 我必须使用mklink /D link targetC:\Users创build别名,因为有些库指向绝对位置。

我遇到了类似的问题,并为此创build了一个小脚本。 这个想法是尽可能简单地使用Dropbox和Git。 目前,我已经快速实现了Ruby代码,并且我将很快添加更多。

该脚本可通过https://github.com/nuttylabs/box-git访问。

如果不使用第三方集成工具,我可以稍微改善一下情况,使用DropBox和其他类似的云盘服务,例如SpitOak和Git。

目标是避免这些文件中间的同步修改,因为它可以上传一个部分状态,然后将其下载回来,完全破坏你的git状态。

为了避免这个问题,我做了:

  1. 捆绑我的git索引在一个文件中使用git bundle create my_repo.git --all
  2. 为文件监控设置延迟,例如5分钟,而不是瞬间。 这减less了DropBox在更改过程中同步部分状态的机会。 当在云盘上快速修改文件时(例如瞬时保存笔记应用程序),它也有很大的帮助。

这不是完美的,因为不能保证它不会再次混淆git状态,但它有帮助,目前我没有得到任何问题。