2017-09-04 11 views
3

2つの文字列の間にgit diffを取得しようとしています。次のコマンドが機能します。Gitディレクトリの外にGitハッシュオブジェクトを作成することはできますか?

git diff $(echo "my first string" | git hash-object -w --stdin) $(echo "my second string" | git hash-object -w --stdin) --word-diff 

ただし、Gitディレクトリ内で実行されないと失敗します。

私は、コマンドのこの部分が失敗していると考えている:それはGitのディレクトリ外で実行することができるように

echo "my first string" | git hash-object -w --stdin 

は、この周りに方法はありますか?

+1

これはあなたの問題に対処しているようです:https://stackoverflow.com/questions/7149984/how-do-i-execute-a-git-command-without-being-on-the-repository-folder?noredirect= 1 – jburtondev

+0

ヘッドアップのおかげで...私のコードが無数のマシンで実行されている場合、確実に--git-dirを設定する方法はありますか? – danday74

答えて

4

私は、コマンドのこの部分が失敗していると信じて:

echo "my first string" | git hash-object -w --stdin 

それはgitの ディレクトリ外で実行できるように、この周りにどのような方法がありますか?

git hash-objectコマンドに渡す-wオプションのために問題が発生しています。このオプションには、副作用writing the object into the git databaseがあるため、既存のリポジトリが必要です。

証明:

$ echo "my first string" | git hash-object -w --stdin 
fatal: Not a git repository (or any parent up to mount point /home) 
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set). 

$ echo "my first string" | git hash-object --stdin 
3616fdee3ac48e5db02fbf9d5e1c2941cfa3e165 

しかし、最終的な目標は、あなたがgit hash-object の助けを借りて、それをしたい場合はgitリポジトリを持っている必要がgit diff 2の間に与えられた文字列を取得するからです。この目的を達成するために、あなたは一時的な空のリポジトリを生成することができます。

git-diff-strings() 
(
    local tmpgitrepo="$(mktemp -d)" 
    trap "rm -rf $tmpgitrepo" EXIT 
    git init "$tmpgitrepo" &> /dev/null 
    export GIT_DIR="$tmpgitrepo"/.git 
    local s1="$1" 
    local s2="$2" 
    shift 2 
    git diff $(git hash-object -w --stdin <<< "$s1") $(git hash-object -w --stdin <<< "$s2") "[email protected]" 
) 

使用

git-diff-strings <string1> <string2> [git-diff-options] 

このアプローチは、bashの機能にパッケージ化することができ

$ tmpgitrepo="$(mktemp -d)" 

$ git init "$tmpgitrepo" 
Initialized empty Git repository in /tmp/tmp.MqBqDI1ytM/.git/ 

$ (export GIT_DIR="$tmpgitrepo"/.git; git diff $(echo "my first string" | git hash-object -w --stdin) $(echo "my second string" | git hash-object -w --stdin) --word-diff) 
diff --git a/3616fdee3ac48e5db02fbf9d5e1c2941cfa3e165 b/2ab8560d75d92363c8cb128fb70b615129c63371 
index 3616fde..2ab8560 100644 
--- a/3616fdee3ac48e5db02fbf9d5e1c2941cfa3e165 
+++ b/2ab8560d75d92363c8cb128fb70b615129c63371 
@@ -1 +1 @@ 
my [-first-]{+second+} string 

$ rm -rf "$tmpgitrepo" 

git-diff-strings "first string" "second string" --word-diff 

そのあなたはgitリポジトリを必要としない、その場合、それらの文字列を含む2つの一時ファイルを作成してgit diff 2つの文字列をすることができます。

+0

優れたもの、感謝レオン、私のアプリにこのすべての機能を今追加する - 非常に感謝:D – danday74

1

@ danday74私はあなたのフィードバックに基づいてコメントを書くことができません(StackOverflowのアクセス許可のため)ここに私の答えです。環境変数usingGIT_DIRを設定することができます。これを複数のマシンで行う場合(そのマシンでこの変数を設定する必要がある)、確実に--git-dirを設定することができます。

これが役に立ちます。

関連する問題