Git 2.7の新機能

バージョン2.6のわずか2か月後に、Git 2.7は新しい機能、修正、およびパフォーマンスの改善を提供しました。 彼は私たちのためにどんな面白いことを準備しましたか? Bitbucketチームにとって興味深いと思われるいくつかの新しいことについてお話しします。



git worktreeコマンドの完全なセット



git worktreeコマンド はGit 2.5登場しました 。これにより、 別々のフォルダーにある多くのリポジトリブランチをアップロードし、同時に作業することができます。 たとえば、緊急のリビジョンを作成する必要があるが、現在の作業コピーを変更したくない場合は、次のコマンドを使用して、目的のブランチを新しいフォルダーにアップロードできます。

$ git worktree add -b hotfix/BB-1234 ../hotfix/BB-1234 Preparing ../hotfix/BB-1234 (identifier BB-1234) HEAD is now at 886e0ba Merged in bedwards/BB-13430-api-merge-pr (pull request #7822)
      
      







Git 2.7はgit worktree listコマンドを追加します。このコマンドは、リポジトリの作業コピーとそれに関連付けられたブランチのリストを表示します。

 $ git worktree list /Users/kannonboy/src/bitbucket/bitbucket 37732bd [master] /Users/kannonboy/src/bitbucket/staging d5924bc [staging] /Users/kannonboy/src/bitbucket/hotfix/BB-1234 37732bd [hotfix/BB-1234]
      
      





git bisectチームによる多くの作業コピーのサポートの改善。 bisectが「良い」および「悪い」コミットに使用したリンクは、 .git / refs / bisectから.git / refs / worktrees / $ worktree_name / refs / bisectに移動したため、 bisectはリポジトリの異なる作業コピーで同時に動作できるようになりました。 。



さらに、Git 2.7以降では、 git cloneを使用して、このような別個の作業コピーを引数として指定できます。これにより、既存の別の作業コピーではなく、独立したgitリポジトリが作成されます。



ブランチだけでなく、個別の作業コピーを作成できることは注目に値します。 他の多くのコマンドと同様に、 git worktree addは、ハッシュまたはタグに関係なく、コミットへのポインターで呼び出すことができます。

 $ git worktree add ../git-2.4.7 ca00f80 Preparing ../git-2.4.7 (identifier git-2.4.7) HEAD is now at ca00f80 Git 2.4.7 $ git worktree add ../git-v2.6.0 v2.6.0 Preparing ../git-v2.6.0 (identifier git-v2.6.0) HEAD is now at be08dee Git 2.6 $ git worktree add ../git-v2.7.0 v2.7.0 Preparing ../git-v2.7.0 (identifier git-v2.7.0) HEAD is now at 7548842 Git 2.7 $ git worktree list /Users/kannonboy/src/git 7548842 [master] /Users/kannonboy/src/git-2.4.7 ca00f80 (detached HEAD) /Users/kannonboy/src/git-v2.6.0 be08dee (detached HEAD) /Users/kannonboy/src/git-v2.7.0 7548842 (detached HEAD)
      
      







いくつかのgit stashの改善



あなたがgit rebaseのファンなら、 おそらく--autostashオプションに精通しているでしょうリベースが実行されるまで、すべてのローカル変更が一時ストレージ( stash )に自動的に保存され、適用後、再度適用されます。

 $ git rebase master --autostash Created autostash: 54f212a HEAD is now at 8303dca It's a kludge, but put the tuple from the database in the cache. First, rewinding head to replay your work on top of it... Applied autostash.
      
      





これは、ダーティな作業コピーをリベースできるため便利です。 さらに便利なように、デフォルトで説明されている動作を行うrebase.autostashパラメーターがあります。 次のコマンドを使用して、グローバルに適用できます。

 $ git config --global rebase.autostash true
      
      





このオプションはGit 1.8.4以降に存在しますが、Git 2.7では--no-autostashオプションを使用してキャンセルする機能が追加されました 。 ほとんどの場合、このオプションは完全性のために追加されています。「ダーティ」な作業コピーをリベースしようとすると、対応する警告のみが表示されるためです。

 $ git rebase master --no-autostash Cannot rebase: You have unstaged changes. Please commit or stash them.
      
      





構成といえば、 stash.showPatchパラメーターについても言及する価値があります。これはGit 2.7でも登場しました。 標準設定では、 git stash showコマンドは一時ストレージ内のファイルに関する簡単な情報のみを表示します。

 $ git stash show package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
      
      





-pオプションを追加で指定すると、出力はファイル変更の詳細な説明によって補足されます。

 diff --git a/package.json b/package.json index c876b26..e21eeb3 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "mkdirp": "^0.5.0", "byline": "^4.2.1", "express": "~3.3.4", - "git-guilt": "^0.1.0", + "git-guilt": "^0.1.1", "jsonfile": "^2.0.0", "jugglingdb-sqlite3": "0.0.5", "jugglingdb-postgres": "~0.1.0",
      
      





stash.showPatchパラメーターは、これをデフォルトの動作にします。 同様のコマンドを使用して、グローバルに適用できます。

 $ git config --global stash.showPatch true
      
      





前のケースと同様に、 -statオプションを使用して、含まれているパラメーターをキャンセルし、古いショート出力に戻すことができます。

 $ git stash show --stat package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
      
      





注意: -- no -patchオプションはエラーにはなりませんが、予想どおりstash.showPatchをキャンセルしません。



Gitフィルター分岐の加速と進行状況インジケーター



git filter-branchは、リポジトリの履歴を変更するための汎用ツールです。 各コミットは親コミットへの参照を持っているため、先祖であるすべてのコミットを推移的に参照するため、1つのコミットを変更すると、必ずそのすべての子孫が変更されます。 これは、十分に古いコミットを変更する必要がある場合、履歴の基本的な変更の操作でも時間がかかる可能性があることを意味します。



Git 2.7では、 フィルター分岐が完了するまでの推定時間を表示するエレガントな進行状況インジケーターが導入されました。





さらに、 フィルターブランチがインデックスまたはツリー内のオブジェクトを変更しない場合、コマンドの実行時にインデックスがまったく読み取られないため、パフォーマンスが大幅に向上します。 上記のアニメーションの--commit-filterオプションは、各コミットの作成者のみを変更し、関連するツリーオブジェクトには影響しません。 最初の1000個のBitbucket Serverコミットの変更は、Git 2.7.0を使用する場合に38秒しかかかりませんでしたが、Git 2.6.0での同様の操作には64秒、つまり40%の速度向上が必要でした。 これらの改善とともにGit 2.7に登場したパフォーマンステストは、 さらに印象的な加速 -最大60%を示しています。



.gitignoreの否定の改善



.Gitignoreファイルを使用すると、作業コピーにあるいくつかのファイルをリポジトリから除外できます。 それらはインデックスに追加されません。 テンプレートは、接頭辞付きの否定フラグをサポートします 特定のファイルを無視してキャンセルすることが可能です。 たとえば、このようなパターンでは、gitはcat.jsonを除く.json拡張子を持つすべてのファイルを無視します。

 # .gitignore *.json !cat.json
      
      





ただし、Git 2.6では、既に無視されたフォルダーにあるファイルに否定を適用することはできませんでした。

 # .gitignore /animals !/animals/cat.json # <--     Git 2.6    
      
      





Git 2.7以降、2番目の例は期待どおりに機能します。 これで、フォルダー内のファイルの無視をキャンセルできます。そうしないと無視されます。



しかし、それだけではありません!



これは、Git 2.7で登場したグッズのごく一部にすぎません。 変更点の完全なリストは、リリースノートおよびGit自体のリポジトリ内のコミットに関するコメントに記載されています

 $ git log v2.6.0..v2.7.0
      
      








オリジナル記事の著者であるTim Pettersenは、JIRA、FishEye / Crucible、Stashの開発に参加しました。 2013年の初め以来、彼は開発プロセス、git、継続的な統合と展開、および開発者、特にBitbucket向けのAtlassianツールについて語っています。 ティムはこれらのことや他のことについてのメモを@kannonboyという仮名でTwitterに定期的に投稿しています。



All Articles