Dan*_*vin 1384

我认为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
Run Code Online (Sandbox Code Playgroud)

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

我写了一篇博客文章,On Version Control,(旧链接 死了)关于我的推理以及我如何设置我的环境,它基于我的Ruby on Rails开发经验,但它可以应用于任何事情,真的.

  • @dubek:你可能最终会破坏共享的裸仓库.这种方法只适用于一个小团队(在我的情况下两个),人们可以在他们的隔间墙上大喊:"嘿!没有人推!我现在正在推!". (158认同)
  • 我已经回到这个页面超过五次使用这个确切的命令序列.我永远不会记住它们,但感谢您提供它们! (73认同)
  • 我想知道如果你同时从两台机器推送到Dropbox裸仓库会发生什么.如果它会导致git的一个内部文件被修改,dropbox会告诉你存在冲突 - 但你怎么做呢?只需选择其中一个版本,然后从两台机器再次推送(逐个)? (60认同)
  • @Ates:至少git是分散的,所以如果你设法破坏了东西,你可以从某人的本地拷贝中恢复它.如果你有一个庞大的团队,很可能有足够的现金用于托管回购. (50认同)
  • @Jo:这不够贫民窟. (31认同)
  • @kilaka:使用裸仓库,只有Git元数据才会同步.如果您将本地存储库直接放入DropBox文件夹,那么每次签出不同的分支时,您会获得更多DropBox流量,因为所有代码文件都会消失/显示/更改.这不一定是一个问题,但它确实增加了在完成(现在可能更长)同步之前关闭计算机的风险,从而导致腐败问题.此外,裸仓还占用较少的空间,这一点很重要,因为DropBox只能免费提供2GB(在撰写本文时). (14认同)
  • 我希望投票有一个冷却时间,这样每次回到这个页面我都可以再投票.到目前为止,这个答案还有十分. (9认同)
  • 我很确定这是不安全的.当然,通过SSH的Git是安全的,但Dropbox不会对并发和锁定做出任何保证,因此您可能会丢失数据.因为你只是用它来作为你的推送和拉动的枢纽*应该*没关系(我认为) - 当事情破裂时你只需删除它并重新启动.但话说回来,仅仅使用SSH服务器托管集线器回购有什么问题? (7认同)
  • Git很聪明,它使用内部数据文件的哈希值,所以你很少会与它的内部状态发生冲突.这就像有多个人访问使用ssh的git位置一样,没有冲突.它就是这样设计的.所以你可以在Dropbox上同时推送到存储库的2个人.我们做到了这一点. (6认同)
  • 这是来自Rails的观点,所以它可能会有所不同,具体取决于你正在开发的内容.直接在Dropbox中工作的问题是那里的文件会有不断的变化,日志,tmp文件,sqlite数据库的变化等等.您可能不希望始终与共享同一Dropbox的其他计算机同步.我喜欢使用Dropbox作为更多的中央回购..我在"本地"(即不在Dropbox文件夹中)克隆回购中完成我的所有工作,然后将更改推送到Dropbox的一个良好的停止点. (6认同)
  • 我在Dropbox中使用了cvs(不寒而栗)并且因为Ates Goral列出的原因丢失了数据.即使您口头告诉任何人不要推送,有时dropbox需要几分钟才能同步,在此期间您可以默默地破坏您的回购.由于本地副本,Git更好,但你仍然应该小心.由于Dropbox的冲突解决方式有效,您将不会收到任何警告. (4认同)
  • **那么为什么不把代码保存在Dropbox/google-drive/ubuntu-one(/等等)中呢?为什么要创建一个原点?**只需保持代码本地和已提交 - 它也将在您的所有计算机上同步.如果你有几个团队成员,你不希望风险两个同时推动,你可能会有一些钱用于真正的git服务器. (4认同)
  • 它可能适用于大多数情况,但请看看我对http://stackoverflow.com/questions/2199637/is-this-plain-stupid-git-sharing-via-dropbox的回答 (3认同)
  • @Ates,我怀疑你会在ref文件和/或reflog上遇到Dropbox级别的冲突.通过快速重命名和/或合并无法解决任何问题.实际的内容文件(对象存储)不会发生冲突,因为那里的所有文件名(包和自由对象)都基于内容散列.但是,如果您在同步完成之前尝试拉动,则可能会出现错误,当然:) (3认同)
  • 我非常高度,强烈建议切换到使用git-remote-dropbox:https://github.com/anishathalye/git-remote-dropbox这允许您使用Dropbox作为远程仓库,而不会出现Dropbox Sync问题. (3认同)
  • Re:将你的工作git repo放在Dropbox上:**这很危险 - Dropbox客户端会暂停几天同步超过一百万个文件以进行小改动**.Dropbox在规模上通常不是很可靠,在Dropbox上有一个工作的git repo是推动它的极限的一个很好的例子. (3认同)
  • @rdey:是的.您可以随时创建本地标签,并在出现问题时进行恢复.这就是git的力量! (2认同)
  • 一个小调整,使它成为`git push -u origin master`; -u设置它以便`git push`和`git pull`在下次没有"origin master"位的情况下工作. (2认同)
  • 我只使用dropbox进行个人备份.所以这种技术对我来说非常适合.它比将工作目录本身放在dropbox下更安全 (2认同)
  • 我用过 Dropbox 和 git。Dropbox 会弄乱 git 存储库。它会错误地同步 git 内部文件,但我们可能无法注意到它。Git 会在之后工作,只有在一段时间后我们才会意识到许多提交已经丢失。 (2认同)

clu*_*clu 122

正确的方法是使用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,一切都将按预期工作.

  • 我很高兴看到有人在这个StackOverflow问题上发布了关于git-remote-dropbox的信息.我想知道是否有任何办法让这个回应更接近顶部.当前接受的答案推荐的方法非常危险,可能导致存储库损坏. (8认同)
  • @clu:是的,您必须提交工作并推动。git-remote-dropbox 所做的只是充当 git 远程助手。就像其他遥控器一样,在推送完成之前,您的本地提交不会被推送到远程。将本地修改的文件放入本地存储库以便推送它们的方法是执行提交。Dropbox 不会知道有关您不在存储库中的文件的任何信息。 (2认同)
  • 只是好奇git-remote-dropbox是否是跨平台的...我看到它使用python,并且我知道Dropbox的某些其他python东西是* not *跨平台的,例如在OS X上,命令行的东西不兼容。 (2认同)

Bra*_*cox 89

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

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

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

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

  • 我觉得git存储库足够强大,不会破坏自己.我的经验(超过一年的使用,主要是单用户,跨平台,跨计算机,多个开发人员),git的回购不容易被破坏.在git中,只有信息被添加到存储库中,现有文件在99.9%的时间内保持不变(可变文件通常很容易手动检查).我有时会看到一个分支指针被覆盖的情况,但这很容易看到(即"分支(XXX的冲突副本)")并删除(实际上不需要真正的修复). (13认同)
  • +1如果您不想公开托管您的存储库,请使用[Bitbucket](http://bitbucket.org),最多5个用户的团队可免费使用私人存储库. (5认同)
  • @Egon如果您从不运行`git gc`,它会自动发生... (2认同)

Eli*_*Eli 16

我不想把我的所有项目放在一个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
Run Code Online (Sandbox Code Playgroud)


teh*_*aus 16

关于使用Dropbox的小团队:

如果每个开发人员在Dropbox上都有他们自己的可写裸存储库,这只能提供给其他开发人员,那么这有助于代码共享而不会有腐败风险!

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


Coy*_*e21 15

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

Git的方法:

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

Dropbox的:

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

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

  • 这是错的.Dropbox不会丢弃冲突.它会破坏一个编辑的文件名,并使用另一个编辑来保持连续性.如果您愿意,可以自己手动合并它们.这是一个很好的妥协,不会丢失数据.http://www.dropbox.com/help/36 (8认同)
  • 是的,但由于这是关于代码的,我花在合并文件上的时间越少,我可以生成的代码越多,而在正常的代码库中,一次可能会有数百个冲突,这取决于项目的维度,这将是一个噩梦.即使借助WinMerge(或类似的东西)之类的合并工具,也可以逐个合并. (4认同)

mer*_*011 15

It is now 2015, and as of three days ago, a new tool based on Dropbox API v2 has been created to safely use git on Dropbox. It works against the API rather than using the desktop client, and correctly handles multiple simultaneous pushes to a repository hosted in a shared folder.

一旦配置,它允许一个人设置一个git遥控器,就像任何其他git遥控器一样.

git clone "dropbox::/path/to/repo"
git remote add origin "dropbox::/path/to/repo"
Run Code Online (Sandbox Code Playgroud)

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

use*_*ser 9

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

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

其次,单片加密容器不仅增加了安全性,还减少了存储库损坏的可能性.

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

建立:

  • 创建一个Truecrypt容器(多个Gigabyte很好)
  • 在Truecrypt首选项下,取消选中preserve modification timestamp*.
  • 如上所述创建一个回购Dan(/sf/answers/137306081/)

用法:

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

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


Mic*_*are 7

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

~/project $ git init
~/project $ git add .
~/project $ gcam "first commit"
~/project $ git-dropbox
Run Code Online (Sandbox Code Playgroud)

这些是我的别名:

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'
Run Code Online (Sandbox Code Playgroud)


den*_*gel 6

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

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

我遗漏的一件事是,一旦推送到原点,就可以通过变更集信息发送电子邮件.我们正在使用Google Wave手动跟踪更改.

  • 有人在使用Google Wave吗? (81认同)

Bra*_*Cox 6

我一直以推荐的方式使用Mercurial,并敦促您保持谨慎,特别是如果任何机器不同的话.Dropbox论坛充满了对自发出现的神秘文件名案例问题的抱怨.Hg(我认为Git)在常规签到期间不会注意到或抱怨,并且当你试图将它用于真实时它会抱怨腐败的回购时你只能听到腐败.坏消息.希望我能更具体地解决这个问题及其解决方法; 我还在努力从这个烂摊子中挖掘出来.


小智 5

还有一个开源项目(跨平台[Linux,Mac,Win]脚本的集合),它使用少量(3-4)命令完成存储库管理的所有细节.

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.
Run Code Online (Sandbox Code Playgroud)

正常的git用法之后:

$ echo “Some change” > somefile.txt
$ git add somefile.txt
$ git commit –m “Created some file”
$ git push
Run Code Online (Sandbox Code Playgroud)

查看项目Wiki和手册以获取完整的命令参考和教程.