2009-05-29 19 views
43

gitで日々の開発作業のためのローカルブランチがあります。私のワークフローは次のとおりです。gitでプライベートブランチをバックアップする方法

  1. local_branch上のものを行う、しかし、
  2. が原点/マスターから新しいものに追いつくために、原点/マスターに
  3. リベースのlocal_branchを取得

それはすべてが正常に動作しますコミット私が遭遇した勧告のほとんどは、リベースが定期的に行われる私的な支店を「押し進め」てはならないと言っています。

ここでの問題は、この場合にはローカルブランチは、サーバおよび保存するための唯一の方法にバックアップされていないということです作品は(すなわち、原点/マスター)

「押し込み」ブランチに戻ってそれをマージすることは何ですかこの場合のワークフローに関する推奨事項はありますか?

ありがとうございます!

UPDATE:私が(外部ユーティリティの使用を避ける)元の要件の1つが不必要な制限であることを認識しました。私は自由のためのバックアップを取得し、この方法 -

私の現在のソリューションは、クラウド同期フォルダ内のすべての私のリポジトリを格納することです。

答えて

48

は、リモートとしてそれを追加します。

git remote add bak server:/path/to/backup/repo 

は、バックアップを実行します。

git push --mirror bak 

これは自動的になりますバックアップリポジトリをアクティブなものに見せる - ブランチは必要に応じて作成、削除、更新されます(強制/非早送りも可能)。あなたも、このためのエイリアスを作成することができます

git config alias.bak "push --mirror bak" 

を次に、それはあなたがバックアップを実行したい場合、「gitのBAK」を実行するだけです。これをcronの仕事に投げることもできます。

+0

- ミラーとconfigのエイリアスに感謝します。 – Art

+0

あなたの設定ファイルを '.git'ディレクトリ(' config'、 'hooks/*'など)から反映しません。 。ただ頭を上げる。それでも、私はそれが良い解決策だと思います。 –

1

あなたはあなたにすべてのブランチをプッシュするか、別のリモートリポジトリを設定することはできますか?もう一つ考慮すべきことは、git repoを含め、ローカルマシン上のすべてのもの(重要)をバックアップすることだけです。

+1

個別のリポジトリを設定しても、変更履歴の問題が残っています。つまり、リベースした後にすぐにプッシュすることはできません。 – Art

2

あなたからリベースされているのと同じブランチにプッシュすることには何も問題はありません。これが正常に動作し、なぜこれらの図は、説明する必要があります

が、これはあなたがlocal_branchを分岐して(CおよびD)にコミットのカップルを作った後のように見えるグラフをコミットするものであると言うことができます。他の誰かが、あなたがlocal_branch分枝から1原点/マスターへ(E)にコミットしてきました:

 
A -- B -- E [origin/master] 
     \ 
     \  
     \-- C -- D [local_branch] 

次にコミットグラフが次の図のようになります、「gitの原点/マスターをリベース」を実行した後。 「起源/マスターは」まだ同じですが、「local_branchは」リベースされました:

 
A -- B -- E [origin/master] 
      \ 
      \ 
      \-- C -- D [local_branch] 

この段階では、あなたが「Gitのプッシュ原点local_branch:マスター」を行う場合、それは簡単な急速になります前方に「起源/マスター」と「local_branchは」同じになります。

 
A -- B -- E -- C -- D [origin/master],[local_branch] 

は今、あなたは「local_branch」に多くの作業を行うには無料です。最終的には、次のようなものが得られます。

 
A -- B -- E -- C -- D -- G -- I [origin/master] 
        \ 
         \ 
         \-- F -- H [local_branch] 

これは、開始グラフとよく似ています。あなたはこのプロセスを何度も何度も繰り返しています。

他のブランチにリベースしないことを避けてください。それはあなたが問題に遭遇するところです(他のブランチには、 "origin/master"からリベースした後、あなたの "local_branch"の履歴が突然書き直されたように見えます)。

+1

これは私の望むものではありません。作業が進行中で、マスターにマージしてバックアップしたくないとします。 – Art

+0

ああ、私はあなたの質問を完全に誤解しました。申し訳ありません。合理的な解決方法は、あなたのローカルリポジトリを*バックアップされた場所に複製することです。バックアップを最新の状態に保つために、定期的に再クローンしてください。しかし、必ずしもクローンで作業をする必要はありません(新しいバックアップを作成する前に、クローンを削除するだけで済みます)。 –

+0

@ Dan、これは "git pull --rebase"を実行するときに得られるワークフローですか? – cmcginty

1

Here's what I do。しかし、これはプライベートではありません。私は自分自身と協力して話すことができるようにこれを行います。それは私が2つ以上のボックスで同じブランチで作業することができます。他の人が共有リポジトリにアクセスできる場合は、ブランチで行っている作業を見ることができます。もちろん、私の家のレポでは誰もアクセス権がないので、まだプライベートです。 githubで、世界中のすべてが私のものを見ることができました。彼らが本当に気にするように。 ;)

+0

あなたは実際の問題であるリベースを行っているようには見えません。 – Art

+0

ローカルコピーを "git pull"してからローカルにrebaseするのはうまくいかないでしょうか?次に、ローカルブランチはマスターからのすべての変更をマージし、次のプッシュはリモートブランチにプッシュします。私は確かに知るためにこれを試さなければならないだろうが、それはうまくいくようだ。 –

+0

Don、非プライベートブランチでリベースした後、次にプルすると競合が発生します。 – Art

4

別のオプションは、すなわち、そのレポ(ない「マスター」)で「起源」レポに、それ自身のブランチに「local_branch」を押すことであろう。そして、

git push origin local_branch:local_backup

とき別のバックアップを作成する準備が整いました(そして作業やリベースを行った後で)元のリポジトリからバックアップブランチを削除してから再度押し出します:

git push origin :local_backup < ===元のブランチを削除します

git push origin local_branch:local_backup

"local_branch"が "origin/master"からリベースされた後で、この方法で問題が発生することはありません。

バックアップブランチを削除すると、最終的に作業を「マスタ」にした後でなければ、あなたは神経質になります。新しいブランチに新しい名前を付けることができます(例: "local_backup1"、 "local_backup2 "など)。

+0

push --forceを使用する場合、削除は不要です。 – Art

+0

はい、--forceは削除の良い代替手段です。リモートブランチヘッドは、ローカルブランチからの新しいブランチヘッドで置き換えられます。 –

+0

デフォルトでは、リモートリポジトリは早送りを拒否するため、--forceは十分ではありません。 http://stackoverflow.com/questions/253055/how-do-i-push-amended-commit-to-the-remote-git-repo/255080#255080 –

3

パーソナルブランチのプッシュには何も問題ありません。人々はあなたの支店に基づいて仕事を始められるかもしれないし、あなたが退職したときに彼らの変更は浮動したままになるので、一般的にはお勧めしません。

私がしていることは、「これは私の支店であり、自己責任で使用する」という接頭辞を使用することです。fc-general-cleanup

私は--mirrorオプションを使用し、個人的なバックアップリポジトリにプッシュ
+0

しかし、rebaseの後、分岐を分岐させる警告が表示されます。 http://superuser.com/q/667146/57249を参照してください。私の枝のために 'git push --force'を行うことが解決策である可能性はありますか? – Dror

+0

もちろん、分岐についての警告があります。それはリベースがしていることです。そう、あなたは 'git push --force'をする必要があります。 – FelipeC

0

むしろgitのレポのすべてファイルを同期するためのDropboxに頼るよりも、私はむしろ(すべてあなたのプライベート支店を含む)のみファイルを生成し、同期Dropboxの付いたファイルそのgit bundleを、使用します。
YarsはDropboxのと同期エラーが発生して述べた、 "Git with Dropbox"

"Backup a Local Git Repository" で参照してください。

関連する問題