diff --git a/src/workflow/ArcanistDiffWorkflow.php b/src/workflow/ArcanistDiffWorkflow.php --- a/src/workflow/ArcanistDiffWorkflow.php +++ b/src/workflow/ArcanistDiffWorkflow.php @@ -2900,6 +2900,10 @@ 'uri' => $staging_uri, ); + list($err, $stdout, $stderr) = exec_manual( + "git ls-files ':(attr:filter=lfs)'"); + $is_lfs = !empty($stdout); + // If the base commit is a real commit, we're going to push it. We don't // use this, but pushing it to a ref reduces the amount of redundant work // that Git does on later pushes by helping it figure out that the remote @@ -2923,7 +2927,7 @@ $refs[] = array( 'ref' => $diff_tag, 'type' => 'diff', - 'commit' => $commit, + 'commit' => $is_lfs ? $base_commit : $commit, 'remote' => $remote, ); @@ -2933,8 +2937,7 @@ } $err = phutil_passthru( - 'git push %Ls -- %s %Ls', - $push_flags, + 'git push -- %s %Ls', $staging_uri, $ref_list); @@ -2949,6 +2952,15 @@ 'use --skip-staging to skip this step.')); } + if ($is_lfs) { + $ref = '+'.$commit.':'.$diff_tag; + $err = phutil_passthru( + 'git push %Ls -- %s %s', + $push_flags, + $staging_uri, + $ref); + } + return $refs; }