有效地同时使用 Git 和 Dropbox?

如何有效地一起使用GitDropbox

答案

我认为 Dropbox 上的 Git 很棒。我一直都在用它。我有多台计算机(两台在家,一台在工作),我将 Dropbox 用作中央裸仓库。由于我不想将其托管在公共服务上,并且我无法访问总是可以通过 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 上的开发经验,但实际上它可以应用于任何东西。

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

在 Dropbox 中创建自己的裸仓库会导致很多问题。 Anish(图书馆的创建者) 对此做出了最好的解释

这些问题的根本原因是 Dropbox 桌面客户端设计用于同步文件,而不是 Git 存储库。如果不对 Git 存储库进行特殊处理,它将无法保证与 Git 相同的保证。远程存储库上的操作不再是原子性的,并且并发操作或带有同步的不幸计时可能会导致存储库损坏。

传统的 Git 遥控器在服务器端运行代码以使其正常工作,但是我们无法做到这一点。

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

对于用户而言,这就像使用 git-remote-dropbox 一样简单,它是 Git 远程助手,充当 Git 和 Dropbox 之间的透明双向桥梁,并维护传统 Git 遥控器的所有保证。与共享文件夹一起使用甚至是安全的,因此它可用于协作(是无限的私人仓库和无限的合作者!)。

使用远程帮助程序,可以将 Dropbox 用作 Git 远程工具,并继续使用所有常规 Git 命令(如 git clone,git pull 和 git push),一切将按预期工作。

这个答案是基于Mercurial 的经验,而不是基于 Git 的经验,但是该经验表明,以这种方式使用 Dropbox 的目的是要求是否有损坏的存储库,甚至您是否有机会在不同的时间从不同的机器更新相同的基于 Dropbox 的存储库(Mac, Unix,Windows)。

我没有可能出错的完整列表,但是这是一个让我感到困惑的具体示例。每台机器都有自己的行尾字符概念以及文件名中大写 / 小写字符的处理方式。 Dropbox 和 Git / Mercurial 对此的处理略有不同(我不记得确切的区别)。如果 Dropbox 更新了 Git / Mercurial 背后的存储库,则该存储库已损坏。这会立即发生并且无形,因此,您甚至不知道自己的存储库已损坏,直到您尝试从其中恢复某些内容为止。

用这种方法从一团糟中挖掘出来后,我一直在使用以下食谱,取得了巨大的成功,没有出现任何问题的迹象。只需将您的存储库移出 Dropbox。使用 Dropbox 进行其他操作;文档, JAR 文件或任何您喜欢的东西。并使用GitHub (Git)或Bitbucket (Mercurial)来管理存储库本身。两者都是免费的,因此这不会增加任何成本,并且每种工具现在都在发挥其优势。

在 Dropbox 上运行 Git / Mercurial 不会增加任何风险。不要这样

我不想将我的所有项目都放在一个 Git 存储库中,也不想进入并为每个项目运行此代码,所以我制作了一个Bash脚本来自动执行该过程。您可以在一个或多个目录上使用它 - 因此它可以为您完成本文中的代码,也可以一次在多个项目中使用。

#!/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 上都有自己的可写裸存储库( 给其他开发人员),则这将促进代码共享而不会造成损坏!

然后,如果您想要一个集中的 “主线”,则可以让一个开发人员从他们自己的存储库中管理所有推送到它的推送。

我不认为使用 Git 和 Dropbox 是要走的路... 只需考虑一下两者的功能:

Git:

  • 允许您拥有一个中央存储库
  • 允许您拥有自己的存储库并进行自己的更改
  • 允许您从中央存储库发送和接收更改
  • 允许多个人更改相同的文件,然后他们将它们合并或在无法合并时要求您对其进行合并
  • 具有 Web 和桌面客户端,以允许访问中央存储库

投寄箱:

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

如果您担心共享某些文件,为什么不加密它们呢?然后,您可以获得 Dropbox to Git 的最大优势,即拥有公共文件和私有文件...

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

配置完成后,它就可以像设置其他 git 远程服务器一样完全设置 git 远程服务器。

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

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

最酷的事情是,如果您修改代码的一小部分,Dropbox 不会同步整个 TrueCrypt 容器。同步时间与更改量大致成比例。即使已加密,TrueCrypt + Dropbox 的组合也可以很好地利用块密码 + 块级别同步。

其次,整体式加密容器不仅增加了安全性,而且还减少了存储库损坏的机会。

警告:但是,在运行 Dropbox 时不要安装容器必须非常小心。如果 2 个不同的客户端将不同版本签入到容器中,则解决冲突也可能会很痛苦。因此,它仅对使用备份进行备份的个人有用,对团队而言则不可行。

设定:

  • 创建一个 Truecrypt 容器(多个千兆字节就可以了)
  • 在 Truecrypt 偏好设置下,取消选中preserve modification timestamp *。
  • 如上文 Dan( https://stackoverflow.com/a/1961515/781695 )所述创建一个仓库

用法:

  • 退出 Dropbox
  • 安装容器,推动您的更改,卸下
  • 运行投寄箱

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

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

~/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'

我们在共享文件夹上使用此方法(在 Dropbox 中创建裸存储库)。

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

我想念的一件事是一种很好的方法,一旦发生原始请求,便会发送一封带有变更集信息的电子邮件。我们正在使用 Google Wave 手动跟踪更改。