题 有效地使用Git和Dropbox?


我该怎么用 混帐 和 Dropbox的 有效地一起?


1062
2017-12-25 08:41


起源


也可以看看 布拉德利赖特的教程。 - Ron Romero
如果你只是一个小团队(我认为最多5个),那么BitBucket为私人存储库提供免费托管。具有讽刺意味的是,我在DropBox上有我的本地回购,以防万一我在处理某些东西时在计算机之间移动。 - Mark Adamson
我不确定你的版本冗余是否具有讽刺意味,但它可能非常有用 - silasdavis
这个问题尚不清楚。将这些工具“有效”地结合在一起意味着什么?它也太宽泛,可能产生自以为是的答案。
嘿,你能不能把我的答案看成是正确的答案: stackoverflow.com/a/32215708/589667。我在答案中提到的这个库是由Dropbox开发人员构建的一个官方工具,用于帮助人们使用Git和Dropbox。 - clu


答案:


我认为Dropbox上的Git很棒。我一直都在使用它。我有多台计算机(两台在家,一台在工作),我使用Dropbox作为中央裸存储库。由于我不想在公共服务上托管它,并且我无法访问我总是可以访问的服务器,因此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/git/project.git 您已与Dropbox帐户关联(或与人共享此目录),您可以执行所有正常的Git操作,它们将自动同步到您的所有其他计算机。

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


1350
2017-12-25 17:10



我想知道如果你同时从两台机器推送到Dropbox裸仓库会发生什么。如果它会导致git的一个内部文件被修改,dropbox会告诉你存在冲突 - 但你怎么做呢?只需选择其中一个版本,然后从两台机器再次推送(逐个)? - dubek
@dubek:你可能最终会破坏共享的裸仓库。这种方法只适用于一个小团队(在我的情况下是两个),人们可以在他们的隔间墙上大喊:“嘿!没人推!我现在正在推!”。 - Ates Goral
@Ates:至少git是分散的,所以如果你设法破坏了东西,你可以从某人的本地副本中恢复它。如果你有一个庞大的团队,很可能有足够的现金用于某个地方的托管回购。 - rdrey
我已经回到这个页面超过五次使用这个确切的命令序列。我永远不会记住它们,但感谢您提供它们! - Jeremy Mack
@Jo:这不是贫民窟。 - Ates Goral


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

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

这些问题的根本原因是Dropbox桌面   客户端用于同步文件,而不是Git存储库。没有   对Git存储库的特殊处理,它不保持相同   保证为Git。远程存储库上的操作不再存在   原子,并发操作或不幸的时机   同步可能导致存储库损坏。

传统的Git远程控制器在服务器端运行代码以使其工作   没错,但我们做不到。

解决方案:可以正确解决此问题。可以使用   Git with Dropbox并具有相同的安全性和一致性保证   作为传统的Git遥控器,即使有多个用户和   并发操作!

对于用户来说,它就像使用Git-remote-dropbox一样简单   作为Git和。之间透明双向桥梁的助手   Dropbox并保持传统Git遥控器的所有保证。   使用共享文件夹甚至是安全的,因此它可以用于   合作(无限制的无限私人回购   合作者!)。

使用远程帮助程序,可以将Dropbox用作Git远程   并继续使用所有常规Git命令,如git clone,git   拉,git推,一切都会按预期工作。


87
2017-08-25 23:25



我很高兴看到有人在这个StackOverflow问题上发布了关于git-remote-dropbox的信息。我想知道是否有任何办法让这个回应更接近顶部。当前接受的答案推荐的方法非常危险,可能导致存储库损坏。 - fwenom
太棒了。我一定会检查一下。但是当我从一个开发盒移动到另一个开发盒时,并且想要继续处理同步回购时,这种方法只有在我离开机器A时总是承诺我的工作并且想要从我离开的地方继续工作时才能工作机器B.我是对的?如果是这样,这不是理想的,因为它会导致一系列“临时”提交,人们可能会认为这将污染回购的提交历史。也许我只是不能吃蛋糕而且也吃它! - bhu Boue vidya
@bhuBouevidya不,那不是真的。您无需通过同步提交您的工作以进行更改。只要保存文件,文件就会同步。基本上如果你在一台机器上有一堆修改过的文件,修改将同步到另一台,因为Dropbox只关心保存到磁盘的内容。 - clu
@clu:是的,你必须承诺你的工作并推动。所有git-remote-dropbox都可以充当git远程助手。就像其他遥控器一样,在完成推送之前,您的本地提交不会被推送到遥控器。将本地修改的文件放入本地存储库以便可以推送它们的方法是通过提交。 Dropbox对存储库中没有的文件一无所知。 - Ants
好奇,如果git-remote-dropbox是跨平台的...我看到它使用python,我知道Dropbox的某些其他python东西是 不 跨平台,例如在OS X上命令行的东西是不兼容的。 - Michael


这个答案是基于 水银 经验,而不是Git,但是这种经验表明,如果你有可能在不同的时间从不同的机器更新同一个基于Dropbox的存储库,那么使用Dropbox这种方式就是要求损坏的存储库(在我的情况下,Mac,Unix,Windows) )。

我没有可能出错的完整列表,但这里有一个特定的例子。每台机器都有自己的行尾字符概念,以及如何在文件名中处理大写/小写字符。 Dropbox和Git / Mercurial对此略有不同(我不记得确切的差异)。如果Dropbox更新Git / Mercurial后面的存储库,那么presto就会破坏存储库。这种情况会立即发生并且不可见,所以在您尝试从中恢复之前,您甚至不知道您的存储库已损坏。

在从一个乱七八糟的事情中挖掘出这种方式之后,我一直在使用以下配方并取得了巨大的成功而没有任何问题的迹象。只需将您的存储库移出Dropbox即可。将Dropbox用于其他一切;文档, JAR文件,你喜欢什么。并使用 GitHub上 (Git)或 到位桶 (Mercurial)管理存储库本身。两者都是免费的,因此这不会增加成本,现在每个工具都发挥其优势。

在Dropbox之上运行Git / Mercurial除了冒险之外什么都不会增加。不要这样做。


85
2018-05-01 20:48



我觉得git存储库足够强大,不会破坏自己。我的经验(超过一年的使用,主要是单用户,跨平台,跨计算机,多个开发人员),是git的回购不容易被破坏。在git中,只有信息被添加到存储库中,现有文件在99.9%的时间内保持不变(可变文件大多容易手动检查)。我有时会看到一个分支指针被覆盖的情况,但这很容易看到(即“分支(XXX的冲突副本)”)并被删除(实际上不需要真正的修复)。 - Egon
@Egon提供你永远不会跑 git gc,这可能会自动发生...... - tc.
@tc:你是对的,在垃圾收集过程中,git中删除了不可访问的信息。但是,我认为对于大多数实际情况,这不会损害稳健性:只有2周以上的无法访问的信息会受到影响(这是DropBox同步的充足时间)。在这种冲突的那一刻,我怀疑大多数信息都是以打包和未打包的形式提供的。 - Egon
我觉得 没有中央回购的代码共享场景 (在下面的答案中描述)将保存一个可能的损坏,因为并发更新dropbox中的目录。如果需要一个中央仓库,它可以单独管理(并且不包括Dropbox); dropbox会保留个人工作回购(这也很方便,因为你可以不时地从你所在团队中的其他人的源代码库中更新/拉取)。 (我实际上正在考虑在这样的环境中使用darc。) - imz -- Ivan Zakharyaschev
+1如果您不想公开托管您的存储库,请使用 到位桶,私人回购免费为最多5个用户的团队。 - Christian Specht


关于使用Dropbox的小团队:

如果每个开发人员在Dropbox上都有自己的可写裸存储库,那就是 只拉 对于其他开发人员来说,这有助于代码共享而不存在腐败风险!

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


16
2017-12-04 12:27



太棒了!此外,为了保护repo损坏免受多次写入,您可以轻松地进行MULTIPLE repos并仅同步其.git文件夹!你需要的一切 - 是从所需的起源拉!伟大的P-to-P男人!你了解分散的git的哲学! - Brian Haak


我不想把我的所有项目放在一个Git存储库下,也不想进入并为每个项目运行这个代码,所以我做了一个 巴什 将自动化该过程的脚本。您可以在一个或多个目录中使用它 - 因此它可以为您执行此帖子中的代码,也可以一次在多个项目上执行此操作。

#!/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

16
2017-12-02 18:37





我不认为使用Git和Dropbox是可行的方法......只要想想两者的特点:

Git的方法:

  • 允许您拥有中央存储库
  • 允许您使用自己的更改拥有自己的存储库
  • 允许您从中央存储库发送和接收更改
  • 允许多个人更改相同的文件并将它们合并,或者如果无法合并则要求您合并它们
  • 是否允许Web和桌面客户端访问中央存储库

Dropbox的:

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

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


15
2018-05-26 09:50



Dropbox只是中央回购的好选择。如果放在一个 共享 它甚至适用于组。 - mac
是的,但你不会拥有与git相同的合并功能,事实上如果有人正在编辑你的同一个文件,并且他在你之后保存文件,你的更改就会丢失,除非你去网页界面下载旧版本(您的版本)。 - Coyote21
这是错的。 Dropbox不会丢弃冲突。它会破坏一个编辑的文件名,并使用另一个编辑来保持连续性。如果您愿意,可以自己手动合并它们。这是一个很好的妥协,不会丢失数据。 dropbox.com/help/36 - Clueless
是的但是因为这是关于代码的,我花在合并文件上的时间越少,我可以生成的代码越多,而在正常的代码库中,根据项目的维度,它可能会同时出现数百个冲突,这将是一场噩梦。即使在像WinMerge(或类似的东西)之类的合并工具的帮助下,也可以逐个合并。 - Coyote21


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

配置完成后,就可以像任何其他git遥控器一样设置一个git遥控器。

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

14
2017-08-23 07:31



如果某个mod会在一个首先提到最新内容的超级线程下在stackexchange上合并所有git-with-dropbox问题,那就太好了。 - Blair Houghton


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

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

其次,单片加密容器不仅增加了安全性,还减少了存储库的机会 腐败 。

警告: 但是,在Dropbox运行时,您必须非常小心未安装容器。如果2个不同的客户端向容器签入不同的版本,则解决冲突也很麻烦。因此,它仅适用于使用它进行备份的单个人,而不适用于团队。

建立:

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

用法:

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

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


8
2018-03-03 16:18



使用a会有很大的不同吗? macos加密.dmg文件图像,同步时间是否仍然与变化成比例? - IBrum
@IBrum抱歉,我没有尝试过.dmg文件 - user