GitとDropboxを一緒に効果的に使用していますか?


1133

GitDropboxを効果的に併用するにはどうすればよいですか?


2
Bradley Wrightのチュートリアルも参照してください。
Ron Romero

39
少人数のチーム(最大5人と思う)の場合、BitBucketはプライベートリポジトリに無料のホスティングを提供します。皮肉なことに、何か作業しているときにコンピューター間を移動する場合に備えて、DropBoxにローカルリポジトリがあります。
Mark Adamson

12
バージョン管理の冗長性が皮肉であるかどうかは
わかり

2
この質問は不明確です。これらのツールを「効果的に」一緒に使用するとはどういう意味ですか?また、範囲が広すぎて、意見が分かれる可能性があります。

3
私の答えを正しいものと見なしてください:stackoverflow.com/a/32215708/589667。私の回答で言及するこのライブラリは、DropboxでGitを使用できるようにするためにDropbox開発者が作成した公式ツールです。
CLU

回答:


1401

DropboxのGitは素晴らしいと思います。いつも使っています。Dropboxを中央のベアリポジトリとして使用する複数のコンピューター(自宅に2台、職場に1台)があります。パブリックサービスでホストしたくなく、常に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/git/project.git、Dropboxアカウントに関連付けた(またはこのディレクトリを他のユーザーと共有した)クローンを作成し、通常のGit操作をすべて実行すると、他のすべてのマシンに自動的に同期されます。

私のブログ記事On Version Controlold link dead)を私の推論と環境のセットアップ方法に書きました。それは私のRuby on Rails開発経験基づいていますが、実際には何にでも適用できます。


61
2台のマシンから同時にDropboxのベアリポジトリにプッシュするとどうなるのだろう。gitの内部ファイルのいずれかが変更される場合、Dropboxは競合があることを示します-では、どうしますか?バージョンの1つを選択し、両方のマシンから(1つずつ)再度プッシュしますか?
dubek

162
@dubek:共有された裸のリポジトリを破壊することになるでしょう。このアプローチは、人々がキュービクルの壁を越えて叫ぶことができる小さなチーム(私の場合は2つ)にのみ適しています。
Ates Goral

50
@Ates:少なくともgitは分散化されているため、物事を破損した場合は、誰かのローカルコピーから復元できます。大規模なチームの場合、ホストされたレポにどこかに十分な現金がある可能性があります。
rdrey

75
この正確な一連のコマンドを使用するために、このページに5回以上戻ってきました。私はそれらを決して記憶しませんが、それらを提供してくれてありがとう!
ジェレミーマック

32
@Jo:それは十分なゲットーではありません。
Ates Goral 2011

128

これを行う正しい方法は、git-remote-dropboxを使用することです:https : //github.com/anishathalye/git-remote-dropbox

Dropboxで独自のベアリポジトリを作成すると、多くの問題が発生します。Anish(ライブラリの作成者)がそれを最もよく説明しています

これらの問題の根本的な原因は、DropboxデスクトップクライアントがGitリポジトリではなくファイルの同期用に設計されていることです。Gitリポジトリの特別な処理がないと、Gitと同じ保証が維持されません。リモートリポジトリでの操作はアトミックではなくなり、同時操作または同期による不運なタイミングにより、リポジトリが破損する可能性があります。

従来のGitリモートは、サーバー側でコードを実行してこれを適切に機能させますが、それはできません。

解決策:これを適切に解決することが可能です。DropboxでGitを使用し、複数のユーザーと同時操作がある場合でも、従来のGitリモートと同じ安全性と一貫性を保証できます。

ユーザーにとっては、GitとDropbox間の透過的な双方向ブリッジとして機能し、従来のGitリモートのすべての保証を維持するGitリモートヘルパーであるgit-remote-dropboxを使用するのと同じくらい簡単です。共有フォルダと一緒に使用しても安全ですので、コラボレーションに使用できます(無制限のプライベートリポジトリで無制限の共同編集者と一緒に!)。

リモートヘルパーを使用すると、DropboxをGitリモートとして使用し、git clone、git pull、git pushなどのすべての通常のGitコマンドを引き続き使用でき、すべてが期待どおりに機能します。


8
このStackOverflowの質問について、誰かがgit-remote-dropboxについて投稿したことをうれしく思います。このレスポンスをトップに近づける方法はあるのでしょうか。現在受け入れられている回答で推奨されている方法はかなり危険であり、リポジトリが破損する可能性があります。
fwenom 2016年

1
かっこいい。私は間違いなくそれをチェックします。しかし、ある開発ボックスから別の開発ボックスに移動して、同期されたリポジトリで作業を続けたい場合、この方法は、マシンAを離れるときに常に作業をコミットし、中断したところから再開したい場合にのみ機能しますマシンB.私は正しいですか?もしそうなら、これは理想的ではありません。それは、「暫定」コミットの混乱を招き、リポジトリのコミット履歴を汚す可能性があると主張する可能性があるためです。多分私はちょうど私のケーキを食べてそれを食べることもできない!
bhu Boue vidya

1
@bhuBouevidyaいいえ、そうではありません。同期による変更のために作業をコミットする必要はありません。ファイルが保存されている限り、ファイルは同期されます。基本的に、1台のマシンに多数の変更されたファイルがある場合、Dropboxはディスクに保存されている内容に注意を払うだけなので、変更は他のマシンに同期されます。
2016年

2
@clu:はい、作業をコミットしてプッシュする必要があります。git-remote-dropboxが行うことは、すべてgitリモートヘルパーとして機能することです。他のリモートと同様に、プッシュが完了するまで、ローカルコミットはリモートにプッシュされません。ローカルで変更されたファイルをローカルリポジトリに入れてプッシュできるようにする方法は、コミットを行うことです。Dropboxは、リポジトリにないファイルについては何も知りません。
Ants 2016

2
git-remote-dropboxがクロスプラットフォームであるかどうか知りたいだけです...私はそれがpythonを使用していることを知り、Dropboxの他の特定のpythonのものクロスプラットフォームではないことを知っています、例えばOS Xではコマンドラインのものは互換性がありません。
マイケル

89

この答えは、GitではなくMercurialの経験に基づいていますが、この経験では、Dropboxをこのように使用すると、さまざまなマシン(Mac、 Unix、私の場合はWindows)。

うまくいかない可能性があることの完全なリストはありませんが、ここに私をかみました具体的な例があります。各マシンには、行末文字の独自の概念と、ファイル名での大文字と小文字の扱い方があります。DropboxとGit / Mercurialはこれを少し異なる方法で処理します(正確な違いを思い出しません)。DropboxがGit / Mercurialのバック、プレスト、壊れたリポジトリの背後にあるリポジトリを更新した場合。これはすぐに目に見えない形で行われるため、リポジトリを復元しようとするまで、リポジトリが壊れていることさえわかりません。

このようにして1つの混乱から掘り下げた後、私は次のレシピを使用して、大きな成功を収め、問題の兆候はありませんでした。リポジトリをDropboxから移動するだけです。それ以外はすべてDropboxを使用してください。ドキュメント、JARファイル、好きなものすべて。また、GitHub(Git)またはBitbucket(Mercurial)を使用して、リポジトリ自体を管理します。どちらも無料ですので、これはコストに何も追加されず、各ツールがその強みを発揮します。

Dropboxの上でGit / Mercurialを実行すると、リスク以外何も追加されません。しないでください。


13
gitリポジトリは、それ自体を破損しないように十分に堅牢であると感じています。私の経験(1年間の使用、主にシングルユーザー、クロスプラットフォーム、クロスコンピューター、複数の開発者)では、gitのリポジトリは簡単には破損しません。gitでは、情報のみがリポジトリに追加され、既存のファイルは99.9%の時間残されます(可変ファイルはほとんど手動で簡単に検査できます)。ブランチポインターが上書きされたケースをときどき見ましたが、これは簡単に見られ(つまり、「ブランチ(XXXの競合するコピー)」)、削除されました(実際に修正する必要はありません)。
エゴン

1
@tc:そうです、ガベージコレクション中に、到達できない情報がgitから削除されます。ただし、ほとんどの場合、これは堅牢性を損なうことはないと思います。2週間以上経過した到達不能な情報のみが影響を受けます(DropBoxが同期するのに十分な時間です)。そして、そのような対立の瞬間に、私はほとんどの情報がパックされた形式とアンパックされた形式の両方で利用可能になると思います。
エゴン2013年

中央リポジトリ(以下の回答で説明)がないコード共有シナリオは、ドロップボックス内のディレクトリへの同時更新による破損の可能性から1つを節約できると思います。中央レポが必要な場合は、個別に管理できます(ドロップボックスの外で)。dropboxは個人の作業リポジトリを保持します(これは、作業のベースとなったチーム内の他の誰かのソースリポジトリから随時更新/プルできるため便利です)。(私は実際にはそのような設定でdarcsを使用することを考えています。)
imz-Ivan Zakharyaschev

5
+1リポジトリをパブリックにホストしたくない場合は、Bitbucketを使用してください。プライベートリポジトリは、最大5ユーザーのチームが無料で使用できます。
Christian Specht 2013

WindowsマシンとOSXマシンの間で気づいたことの1つは、ファイルのアクセス許可がdiffの問題を引き起こす可能性があることです。"git config core.fileMode false"
devdrc

16

Dropboxを使用している小さなチームに関して:

各開発者がDropboxに独自の書き込み可能なベアリポジトリを持っている場合、それは他の開発者にのみプルされ、破損のリスクなしにコード共有を容易にします!

次に、集中化された「メインライン」が必要な場合は、1人の開発者が自分のリポジトリからプッシュするすべてのプッシュを管理できます。


1
すごい!また、複数の書き込みからリポジトリの破損を保護するために、複数のリポジトリを作成して.gitフォルダーのみを同期することも簡単にできます。すぐに必要なのは、目的の起源から引っ張ることです!素晴らしいP-to-P男!あなたは分散型gitの哲学を理解しています!
ブライアンハーク2014

16

すべてのプロジェクトを1つのGitリポジトリに配置したくなかったし、すべてのプロジェクトに対してこのコードを実行したくなかったので、プロセスを自動化するBashスクリプトを作成しました。1つまたは複数のディレクトリで使用できます。この投稿のコードを実行したり、複数のプロジェクトで同時に実行したりできます。

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

15

GitとDropboxを使用する方法はないと思います...両方の機能について考えてみてください。

ギット:

  • 中央リポジトリを持つことができます
  • 独自の変更を加えた独自のリポジトリーを持つことができます
  • 中央リポジトリとの間で変更を送受信できます
  • 複数の人が同じファイルを変更することを許可し、それらがそれらをマージするか、それができない場合はそれらをマージするように求めます
  • 中央リポジトリへのアクセスを許可するWebおよびデスクトップクライアントがあります

ドロップボックス:

  • すべてを中央リポジトリに保管します
  • サーバーに独自のバージョンのファイルを置くことができます
  • 中央リポジトリとの変更の送受信を強制します
  • 複数の人が同じファイルを変更した場合、最初にコミットされたファイルがその後のコミットで置き換えられ、面倒なマージは発生しません(そして間違いなく最大の欠点です)。
  • 中央リポジトリへのアクセスを許可するWebおよびデスクトップクライアントがあります。

また、ファイルの共有に不安がある場合は、暗号化しないでください。そして、DropboxからGitへの最大の利点、つまりパブリックファイルとプライベートファイルを利用できるようになります...


Dropboxは中央レポのちょうど良いオプションです。共有フォルダに配置すると、グループに対しても機能します。
Mac

1
はい、ただしgitと同じマージ機能はありません。実際、誰かがあなたと同じファイルを編集していて、彼があなたの後にファイルを保存した場合、Webインターフェースにアクセスしてダウンロードしない限り、変更は失われます。古いバージョン(あなたのバージョン)。
コヨーテ21

8
これは間違っています。Dropboxは競合を削除しません。1つの編集のファイル名をマングルし、継続性のためにもう1つを使用します。必要に応じて、手動でそれらをマージできます。これは適切な妥協案であり、データを失うことはありません。dropbox.com/help/36
無知

6
はい。ただし、これはコードに関するものであるため、ファイルのマージに費やす時間が短いほど、生成できるコードが多くなります。通常のコードベースでは、プロジェクトの規模によっては、一度に数百もの競合が発生する可能性があり、 WinMerge(または同様のもの)のようなマージツールを使用しても、1つずつマージします。
Coyote21

15

現在は2015年で、3日前の時点で、Dropboxでgitを安全に使用するために、Dropbox API v2に基づく新しいツールが作成されています。デスクトップクライアントを使用するのではなくAPIに対して機能し、共有フォルダーでホストされているリポジトリへの複数の同時プッシュを正しく処理します。

設定すると、他のgitリモートとまったく同じようにgitリモートを設定できます。

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

2
いくつかのmodが、最新のものを最初に言及するスーパースレッドの下で、stackexchangeの多くのgit-with-dropbox質問をすべてマージするとよいでしょう。
ブレアホートン2016年

9

暗号化されたリモートバックアップにはMercurial(またはGit)+ TrueCrypt + Dropboxを使用しています。

最もクールなのは、コードの一部を変更した場合、DropboxがTrueCryptコンテナー全体を同期しないことです。同期時間は、変更量にほぼ比例します。暗号化されていても、TrueCrypt + Dropboxの組み合わせにより、ブロック暗号+ブロックレベル同期の優れた使用法が実現します。

第2に、モノリシックな暗号化されたコンテナは、セキュリティを強化するだけでなく、リポジトリの可能性を減らします 破損

注意:ただし、Dropboxの実行中にコンテナがマウントされないように注意する必要があります。また、2つの異なるクライアントが異なるバージョンをコンテナにチェックインする場合、競合を解決するのが面倒な場合もあります。したがって、それはチームではなく、バックアップに単一の人が使用する場合にのみ実用的です。

セットアップ:

  • Truecryptコンテナーを作成します(複数のギガバイトで構いません)。
  • Truecrypt設定で、チェックを外します preserve modification timestamp *のます。
  • 上記のDanによるレポの作成(https://stackoverflow.com/a/1961515/781695

使用法:

  • Dropboxを終了
  • コンテナーをマウントし、変更をプッシュして、アンマウントします
  • Dropboxを実行する

PSチェックをpreserve modification timestamp外すと、ファイルが変更され、同期する必要があることがDropboxに通知されます。コンテナーをマウントすると、コンテナー内のファイルを変更していなくても、タイムスタンプが変更されることに注意してください。そうしたくない場合は、ボリュームをread-only


macosで暗号化された.dmgファイルイメージを使用している場合でも、同期時間は変更に比例して粗くなりますか?
IBrum 2018

@IBrum申し訳ありませんが、.dmgファイルで試したことはありません。
ユーザーの

7

ダンマクネビンの答えが大好きです。私も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'

私はおそらく、最後にエイリアスではなく、シェルスクリプトを使用しません。そうでなければ、私はこれがとても好きです。awkの使用に対する追加のクレジット。
pauljohn32

6

共有フォルダーでこの方法を使用します(Dropboxでベアリポジトリを作成します)。

少数の開発者グループは、同期されていないリポジトリからプルして、ローカルクローンを作成できます。作業単位が完了すると、元に戻ります。

私が見逃していることの1つは、オリジンへのプッシュが発生したときに、変更セット情報を電子メールで送信するための良い方法です。Google Waveを使用して、手動で変更を追跡しています。


81
誰かがGoogle Waveを使用していますか?
クリストファージョンソン2010

6

私は推奨される方法でMercurialを使用してきました。特に、いずれかのマシンが異なる場合は注意してください。Dropboxフォーラムは、不可解なファイル名の大文字小文字の問題が自発的に発生するという苦情でいっぱいです。Hg(と私はGitと思います)は定期的なチェックイン中に気づかないか不平を言うことはありません。実際にそれを使用しようとすると、破損したリポジトリについて不平を言うときにのみ破損について聞こえます。悪いニュース。私は問題とその回避策についてより具体的になることを望みます。私はまだこの混乱から自分を掘り出そうとしています。


私は水銀について同じ問題を抱えていました
トンバは

gitは、設計上、他のものよりもはるかに多くの破損チェックを行います。したがって、少なくともそれがいつ発生し、問題を修正できるかがわかります。
Anders

6

オープンソースプロジェクト(クロスプラットフォーム[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.

その後、通常のgitの使用:

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

完全なコマンドリファレンスとチュートリアルについては、プロジェクトのwikiとマニュアルを確認してください。


4

私は、Github以外のリポジトリをDropboxに保存しています。私が遭遇した1つの警告は、再インストール後に同期することでした。Dropboxは、小さいファイルを最初にダウンロードしてから、大きいファイルに移動します。夜から始めて週末の後で戻ってきても問題ありません:-)

私のスレッド-http://forums.dropbox.com/topic.php ? id = 29984&replies=6


4

今2014年、GitとDropboxを1年半ほど使っていて問題なく使っています。しかしいくつかのポイント:

  • Dropboxを使用している私のマシンはすべてWindowsで、バージョンが異なります(7から8)+ 1 Mac。
  • 私はリポジトリを他の誰かと共有しないので、私がそれを変更するのは私だけです。
  • git push リモートリポジトリにプッシュするため、破損した場合でも簡単に回復できます。
  • 私は中にエイリアスを作成しなければならなかったC:\Usersmklink /D link targetいくつかのライブラリは、絶対的な場所に指摘されたため。

3

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}"

スクリプトにはプロジェクト名のみが必要です。gitリポジトリを生成します~/Dropbox/git/指定された名前で、現在のディレクトリの内容全体を新しく作成されたオリジンマスターブランチにプッシュします。複数のプロジェクト名が指定されている場合は、右端のプロジェクト名引数が使用されます。

オプションで、-rコマンド引数は、オリジンマスターにプッシュするリモートブランチを指定します。プロジェクトの起点マスターの場所は、-m引数で指定することもできます。デフォルトの.gitignoreファイルもリモートブランチディレクトリに配置されます。ディレクトリと.gitignoreファイルのデフォルトは、スクリプトで指定されます。


3

別のアプローチ:

これまでのすべての回答は、最も人気のある@Dan回答を含め、githubやbitbucketなどのgitに焦点を当てたサービスを使用する代わりに、Dropboxを使用して共有リポジトリを集中管理するという考えに対応しています。

ただし、元の質問では「GitとDropboxを効果的に併用する」の実際の意味が指定されていないため、「Dropboxを使用してワークツリーのみを同期する」という別のアプローチに取り組みましょう。

ハウツーには次の手順があります。

  1. プロジェクトディレクトリ内で、一つは空の作成.gitディレクトリ(例えばmkdir -p myproject/.git

  2. .gitDropbox のディレクトリの同期を解除します。Dropboxアプリを使用している場合:[設定]、[同期]に移動し、「同期するフォルダーを選択」してください。ここで、.gitディレクトリをマーク解除する必要があります。これにより、.gitディレクトリが削除されます。

  3. git initプロジェクトディレクトリで実行

.gitすでに存在する場合も機能します。手順2のみを実行してください。DropboxはgitファイルのコピーをWebサイトに保持します。

ステップ2では、Dropboxがgitシステム構造を同期しなくなります。これは、このアプローチの望ましい結果です。

なぜこのアプローチを使用するのですか?

  • まだプッシュされていない変更にはDropboxバックアップがあり、デバイス間で同期されます。

  • Dropboxがデバイス間で同期しているときに何かをねじ込む場合、git statusそしてgit diff物事を整理するのに便利です。

  • Dropboxアカウントのスペースを節約します(履歴全体がそこに保存されることはありません)

  • @Danの回答に関するコメントで@dubekと@Atesによって提起された懸念、および別の回答での @cluによる懸念を回避します

他の場所(githubなど)にリモートが存在する場合は、この方法で問題なく動作します。

異なるブランチで作業すると、いくつかの問題が発生します。これらの問題に対処する必要があります。

  • 1つの潜在的な問題は、Dropboxが(不必要に?)さまざまなブランチをチェックアウトするときに潜在的に多くのファイルを同期することです。

  • 複数のDropbox同期デバイスで異なるブランチがチェックアウトされている場合、両方のデバイスへのコミットされていない変更が失われる可能性があります。

これらの問題を回避する1つの方法は、を使用git worktreeしてブランチのチェックアウトを別のディレクトリに保持することです。


バージョン管理に適しているだけでなく、iPadで(Dropbox同期を介して)編集可能であるファイルに取り組んでいる誰かとして、この回答はその使用例をカバーしています。
Vagari

簡単なフォローアップ、現在のDropboxの動作は異なります。Dropboxを削除して同期しないように指示するだけでは、その逆であり、クラウドにとどまり、ローカルから削除されます。しかし、解決策にはスーパーユーザーの答えがあります。superuser.com/a/1527145/109561私の場合(Macの場合)、無視するようにファイルにフラグを付けますxattr -w com.dropbox.ignored 1 /path/to/somewhere
Vagari

3

私の2セントの場合、Dropboxは、中央のレポホストを取得する手間をかけたくない個人的な用途にのみ有効です。専門的な開発では、おそらくスレッドですでに何度か言及されているように、Dropboxはこのユースケース用に設計されていません。とは言え、サードパーティのプラグインやツールなしでDropboxにリポジトリをダンプする完全に安全な方法は、バンドルを使用することです。.gitconfig入力を節約するために、次のエイリアスを持っています。

[alias]
        bundle-push = "!cd \"${GIT_PREFIX:-.}\" && if path=\"$(git config remote.\"$1\".url)\" && [ \"${path:0:1}\" = / ]; then git bundle create \"$path\" --all && git fetch \"$1\"; else echo \"Not a bundle remote\"; exit 1; fi #"
        bundle-fetch = "!cd \"${GIT_PREFIX:-.}\" && if path=\"$(git config remote.\"$1\".url)\" && [ \"${path:0:1}\" = / ]; then git bundle verify \"$path\" && git fetch \"$1\"; else echo \"Not a bundle remote\"; exit 1; fi #"
        bundle-new = "!cd \"${GIT_PREFIX:-.}\" && if [ -z \"${1:-}\" -o -z \"${2:-}\" ]; then echo \"Usage: git bundle-new <file> <remote name>\"; exit 1; elif [ -e \"$2\" ]; then echo \"File exist\"; exit 1; else git bundle create \"$2\" --all && git remote add -f \"$1\" \"$(realpath \"$2\")\"; fi #"

例:

# Create bundle remote (in local repo)
$ git bundle-new dropbox ~/Dropbox/my-repo.bundle
# Fetch updates from dropbox
$ git bundle-fetch dropbox
# NOTE: writes over previous bundle. Thus, roughly equivalent to push --force --prune --all
$ git bundle-push

2

私は同様の問題に直面し、同じための小さなスクリプトを作成しました。アイデアは、GitでDropboxをできるだけ簡単に使用することです。現在、Rubyコードをすぐに実装しましたが、すぐに追加します。

スクリプトにはからアクセスできますhttps://github.com/nuttylabs/box-git


0

サードパーティの統合ツールを使用せずに、条件を少し強化して、DropBoxと、Gitを備えたSpiderOakなどの他の同様のクラウドディスクサービスを使用できます。

目標は、これらのファイルの変更の途中での同期を回避することです。これは、部分的な状態をアップロードしてからダウンロードし直し、git状態を完全に破壊する可能性があるためです。

この問題を回避するために、私はしました:

  1. を使用してgitインデックスを1つのファイルにバンドルしますgit bundle create my_repo.git --all
  2. 瞬時ではなく、ファイル監視の遅延を、たとえば5分に設定します。これにより、DropBoxが変更の途中で部分的な状態を同期する可能性が低くなります。また、クラウドディスク上のファイルをオンザフライで変更するときにも役立ちます(メモをとるアプリを瞬時に保存する場合など)。

再びgit状態を台無しにしないという保証はないので、完璧ではありませんが、それは役に立ち、今のところ問題はありませんでした。


0

MacOSでは、Dropboxを停止して変更を加え、Dropboxを再起動することもできます。次の組み合わせを使用しており、非常に満足しています。

両方(ローカルのgit管理プロジェクトディレクトリとDropboxにあるリモートのgitリポジトリ)で次のコマンドを実行して、自動パッキングを無効にします(これは、ドロップボックスの同期に関する主な問題です)。

git config --global gc.auto 0

その後、時々、ドロップボックスを無効にしてリポジトリを圧縮します。たとえば、アプリの新しいリリースを作成するたびに、bash-build-scriptで次のことを行います。

osascript -e "tell application \"Dropbox\" to quit"

# Compress local
git gc --prune=now; git repack -a -d

# Compress remote
REPOS_DIR_REMOTE=`git remote get-url --push origin`
cd "${REPOS_DIR_REMOTE}"
git gc --prune=now; git repack -a -d

osascript -e "tell application \"Dropbox\" to launch"
osascript -e "display notification with title \"Compress Done\""
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.