Skip to content

Setting environment variables for git command #95

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
domeales-paloit opened this issue Oct 23, 2023 · 2 comments
Open

Setting environment variables for git command #95

domeales-paloit opened this issue Oct 23, 2023 · 2 comments

Comments

@domeales-paloit
Copy link

Hi there,

Is it possible to set the environment variables for the git commands?

I would like to set GIT_SSH_COMMAND like here: https://stackoverflow.com/a/29754018

Is this possible? Can you give me any example?

Thanks,
Dom

@janpecha
Copy link
Contributor

Hi, currently not, but you can prepare custom Runner https://github.com/czproject/git-php/blob/master/src/Runners/CliRunner.php and send PR :)

I think Runner can be very simple:

namespace CzProject\GitPhp\Runners;

use CzProject\GitPhp\IRunner;

class EnvironmentVarsRunner implements IRunner
{
  private $env;
  private $runner;

  public function __construct(array $env, IRunner $runner)
  {
    $this->env = $env;
    $this->runner = $runner;
  }

  public function run($cwd, array $args, array $env = NULL)
  {
     if ($env === NULL) {
        $env = $this->env;
     } else {
        $env = array_merge($this->env, $env);
     }

     return $this->runner->run($cwd, $args, $env);
  }
}

// usage:
$cliRunner = new CzProject\GitPhp\Runners\CliRunner;
$envRunner = new CzProject\GitPhp\Runners\EnvironmentVarsRunner([
  'GIT_SSH_COMMAND' => '...',
], $cliRunner);
$git = new CzProject\GitPhp\Git($envRunner);

@peterjaap
Copy link

peterjaap commented Apr 24, 2025

Thanks, I made this;

<?php

namespace App\Git;

use CzProject\GitPhp\Runners\CliRunner;
use CzProject\GitPhp\RunnerResult;
use CzProject\GitPhp\GitException;

class SshRunner extends CliRunner
{
    /**
     * @var string|null
     */
    private ?string $sshKeyFile = null;

    /**
     * @var string|null
     */
    private ?string $knownHostsFile = null;

    /**
     * Destructor to clean up temporary files
     */
    public function __destruct()
    {
        $this->cleanupTemporaryFiles();
    }

    /**
     * Run git command with SSH key from environment variable
     *
     * @param string $cwd
     * @param array $args
     * @param array|null $env
     * @return RunnerResult
     */
    public function run($cwd, array $args, ?array $env = NULL)
    {
        // Get SSH key from environment variable
        $sshKey = getenv('SSH_PRIVATE_KEY');

        if ($sshKey) {
            // Create environment variables array if not provided
            if ($env === NULL) {
                $env = [];
            }

            // Set up SSH key and known hosts files
            $this->setupSshFiles($sshKey);

            // Set GIT_SSH_COMMAND environment variable to use the SSH key
            $env['GIT_SSH_COMMAND'] = sprintf(
                'ssh -i %s -o UserKnownHostsFile=%s -o StrictHostKeyChecking=yes',
                $this->sshKeyFile,
                $this->knownHostsFile
            );
        }

        // Call parent run method with the environment variables
        return parent::run($cwd, $args, $env);
    }

    /**
     * Set up SSH key and known hosts files
     *
     * @param string $sshKey
     * @return void
     * @throws GitException
     */
    private function setupSshFiles(string $sshKey): void
    {
        // Create temporary directory for SSH files
        $tempDir = sys_get_temp_dir() . '/git_ssh_' . uniqid();
        if (!mkdir($tempDir, 0700, true)) {
            throw new GitException("Unable to create temporary directory for SSH files");
        }

        // Create SSH key file
        $this->sshKeyFile = $tempDir . '/id_rsa';
        file_put_contents($this->sshKeyFile, $sshKey);
        chmod($this->sshKeyFile, 0600);

        // Create known hosts file
        $this->knownHostsFile = $tempDir . '/known_hosts';
        file_put_contents($this->knownHostsFile, "putyourknownhostshere");
        chmod($this->knownHostsFile, 0600);
    }

    /**
     * Clean up temporary files
     *
     * @return void
     */
    private function cleanupTemporaryFiles(): void
    {
        // Clean up SSH key file
        if ($this->sshKeyFile !== null && file_exists($this->sshKeyFile)) {
            unlink($this->sshKeyFile);
            $this->sshKeyFile = null;
        }

        // Clean up known hosts file
        if ($this->knownHostsFile !== null && file_exists($this->knownHostsFile)) {
            unlink($this->knownHostsFile);
            $this->knownHostsFile = null;

            // Remove parent directory
            $tempDir = dirname($this->knownHostsFile);
            if (is_dir($tempDir)) {
                rmdir($tempDir);
            }
        }
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants