私たちはgitサブモジュールを使用して、開発した他の多くのライブラリに依存するいくつかの大きなプロジェクトを管理しています。各ライブラリは、サブプロジェクトとして依存プロジェクトに組み込まれた個別のリポジトリです。開発中、依存するすべてのサブモジュールの最新バージョンを取得したいことがよくあります。
gitにはこれを行うための組み込みコマンドがありますか?そうでない場合、Windowsバッチファイルまたはそれを行うことができる同様のファイルはどうですか?
私たちはgitサブモジュールを使用して、開発した他の多くのライブラリに依存するいくつかの大きなプロジェクトを管理しています。各ライブラリは、サブプロジェクトとして依存プロジェクトに組み込まれた個別のリポジトリです。開発中、依存するすべてのサブモジュールの最新バージョンを取得したいことがよくあります。
gitにはこれを行うための組み込みコマンドがありますか?そうでない場合、Windowsバッチファイルまたはそれを行うことができる同様のファイルはどうですか?
回答:
それはだ場合は、初めてあなたがチェックアウトあなたが使用する必要がレポ--init
最初に:
git submodule update --init --recursive
以下のためのgit 1.8.2以上、オプションは、--remote
リモートブランチの最新のヒントにサポート更新に追加されました。
git submodule update --recursive --remote
これには、.gitmodules
または.git/config
ファイルで指定された「デフォルト以外」のブランチを尊重するという追加の利点があります(たまたまある場合、デフォルトはorigin / masterです。この場合、他の回答のいくつかも機能します)。
以下のためのgit 1.7.3使用できる以上(ただし、更新はまだ適用されないものを周りの落とし穴以下):
git submodule update --recursive
または:
git pull --recurse-submodules
サブモジュールを現在のコミットではなく最新のコミットにプルしたい場合は、リポジトリがポイントします。
詳細はgit-submodule(1)を参照してください
git submodule update --recursive
今日を使うべきです。
git submodule foreach "(git checkout master; git pull)&"
origin master
で、一部のサブモジュールがその特定のサブモジュールの異なるブランチまたはロケーション名を追跡している場合、このコマンドの最後に盲目的に貼り付けると、予期しない結果になる可能性があります。一部の人にとっては明白ですが、おそらく誰にとってもそうではありません。
git submodule update --recursive
親リポジトリがサブモジュールごとに保存したリビジョンを確認し、各サブモジュールでそのリビジョンをチェックアウトします。各サブモジュールの最新のコミットはプルされません。git submodule foreach git pull origin master
またはgit pull origin master --recurse-submodules
、各サブモジュールを元のリポジトリから最新のものに更新する場合に必要です。そうして初めて、サブモジュールの更新されたリビジョンハッシュを持つ親リポジトリの保留中の変更が取得されます。それらをチェックインすれば、大丈夫です。
git pull --recurse-submodules --jobs=10
gitが1.8.5で最初に学習した機能。
バグが修正されるまで、初めて実行する必要があります
git submodule update --init --recursive
git pull --recurse-submodules
たりすることはgit submodule update --recursive
ないではない、新たに追加されたサブモジュールを初期化しません。それらを初期化するには、を実行する必要がありますgit submodule update --recursive --init
。マニュアルからの引用:サブモジュールがまだ初期化されておらず、.gitmodulesに保存されている設定を使用したいだけの場合は、-initオプションを使用してサブモジュールを自動的に初期化できます。
git submodule update --recursive --remote
保存されたSHA-1ではなく、リモートの最新リビジョンにサブモジュールを更新するヒントを追加することもできます。
git submodule update --init --recursive
git repoディレクトリ内から、私に最適です。
これにより、サブモジュールを含む最新のすべてがプルされます。
git - the base command to perform any git command
submodule - Inspects, updates and manages submodules.
update - Update the registered submodules to match what the superproject
expects by cloning missing submodules and updating the working tree of the
submodules. The "updating" can be done in several ways depending on command
line options and the value of submodule.<name>.update configuration variable.
--init without the explicit init step if you do not intend to customize
any submodule locations.
--recursive is specified, this command will recurse into the registered
submodules, and update any nested submodules within.
git submodule update --recursive
git repoディレクトリ内から、私に最適です。
これにより、サブモジュールを含む最新のすべてがプルされます。
注:これは2009年のもので、当時は良かったかもしれませんが、現在はより良いオプションがあります。
これを使っています。それはgit-pup
:
#!/bin/bash
# Exists to fully update the git repo that you are sitting in...
git pull && git submodule init && git submodule update && git submodule status
適切なbinディレクトリ(/ usr / local / bin)に置くだけです。Windowsの場合、構文を変更して機能させる必要があるかもしれません:)
更新:
すべてのサブモジュールのすべてのHEADを取得することに関する元の作者のコメントへの回答-これは良い質問です。
git
これには内部的にコマンドがないと確信しています。そのためには、サブモジュールにとってHEADが本当に何であるかを特定する必要があります。それmaster
は、最新のブランチなどであると言うだけの簡単なことかもしれません...
これに続いて、以下を実行する簡単なスクリプトを作成します。
git submodule status
「変更された」リポジトリを確認します。出力行の最初の文字はこれを示しています。サブレポが変更された場合、続行しない場合があります。git checkout master && git pull
ます。エラーをチェックします。このスタイルは、実際にはgitサブモジュールが設計されたものではないことを述べておきます。通常、「LibraryX」のバージョンは「2.32」で、「アップグレード」と指示するまでそのままです。
つまり、ある意味では、記述されたスクリプトを使用して実行していることですが、それは自動的に行われます。お手入れが必要です!
アップデート2:
Windowsプラットフォームを使用している場合は、Pythonを使用してスクリプトを実装することを検討することをお勧めします。スクリプトはこれらの領域で非常に機能します。unix / linuxを使用している場合は、bashスクリプトのみをお勧めします。
説明が必要ですか?コメントを投稿してください。
git config --global alias.pup '!git pull && git submodule init && git submodule update && git submodule status'
使用しgit pup
ます。
git submodule init
ますが、サブモジュールが含まれている最初のプルの後に実行する必要がありました。
ヘンリックは正しい方向に進んでいます。'foreach'コマンドは任意のシェルスクリプトを実行できます。最新のものを取得する2つのオプションは、
git submodule foreach git pull origin master
そして、
git submodule foreach /path/to/some/cool/script.sh
これにより、初期化されたすべてのサブモジュールが反復処理され、指定されたコマンドが実行されます。
以下はWindows上で私のために働いた。
git submodule init
git submodule update
編集:
コメントで(philfreoによって)最新バージョンが必要であると指摘されました。最新バージョンである必要があるネストされたサブモジュールがある場合:
git submodule foreach --recursive git pull
-----以下の古いコメント-----
これは正式な方法ではありませんか?
git submodule update --init
毎回使っています。今のところ問題ありません。
編集:
私はあなたが使えることがわかりました:
git submodule foreach --recursive git submodule update --init
これにより、サブモジュール、つまり依存関係もすべて再帰的にプルされます。
git submodule update --init --recursive
git submodule foreach --recursive git pull
サブモジュールのデフォルトのブランチがでない master
場合があるので、これがGitサブモジュールの完全なアップグレードを自動化する方法です。
git submodule init
git submodule update
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'
サブモジュールの複製と初期化
git clone git@github.com:speedovation/kiwi-resources.git resources
git submodule init
開発中にサブモジュールをプルして更新するだけです
git pull --recurse-submodules && git submodule update --recursive
git submodule foreach git pull origin master
git submodule update --remote --merge
注:最後の2つのコマンドの動作は同じです
git submodule update
、トリックをしました。次に、クローンの最初のステップで欠落しているサブモジュールデータをダウンロードしています。ありがとうございました。私はgitが得意ではありません:C
上記の回答は適切ですが、これを簡単にするためにgit-hooksを使用していましたが、git 2.14ではgit config submodule.recurse
、gitリポジトリにプルしたときにサブモジュールを更新できるようにtrueに設定できることがわかりました。
ただし、サブモジュールがブランチ上にある場合は、すべてのサブモジュールの変更をプッシュするという副作用がありますが、その動作が必要な場合は、これで十分です。
以下を使用して実行できます。
git config submodule.recurse true
git submodule init
サブモジュールがまだ初期化されていない場合でも、残念ながらまだこのオプションを使用する必要があります。
リポジトリのトップレベルから:
git submodule foreach git checkout develop
git submodule foreach git pull
これにより、すべてのブランチが切り替えられ、最新の開発とプルが行われます
git submodule foreach git pull origin master
フェッチしたいブランチを追加する必要がありました。それ以外は、完全に機能しました。
私は上記のgahooaの答えを適応させることでこれを行いました:
gitと統合して[alias]
...
親プロジェクトに次のようなものがある場合.gitmodules
:
[submodule "opt/submodules/solarized"]
path = opt/submodules/solarized
url = git@github.com:altercation/solarized.git
[submodule "opt/submodules/intellij-colors-solarized"]
path = opt/submodules/intellij-colors-solarized
url = git@github.com:jkaving/intellij-colors-solarized.git
.gitconfig内にこのようなものを追加してください
[alias]
updatesubs = "!sh -c \"git submodule init && git submodule update && git submodule status\" "
次に、サブモジュールを更新するには、次のコマンドを実行します。
git updatesubs
私の環境設定リポジトリにその例があります。
備考:あまり簡単な方法ではありませんが、実行可能であり、独自の独自の長所があります。
HEAD
リポジトリのリビジョンとHEAD
そのすべてのサブモジュールのs のみを複製する場合(つまり、「トランク」をチェックアウトする場合)、次のLuaスクリプトを使用できます。単純なコマンドを実行git submodule update --init --recursive --remote --no-fetch --depth=1
すると、回復不可能なgit
エラーが発生する場合があります。この場合、ディレクトリのサブディレクトリをクリーンアップ.git/modules
し、git clone --separate-git-dir
コマンドを使用してサブモジュールを手動で複製する必要があります。唯一の複雑さは、スーパープロジェクトツリーでURL、.git
サブモジュールのディレクトリのパス、サブモジュールのパスを見つけることです。
備考:スクリプトはhttps://github.com/boostorg/boost.git
リポジトリに対してのみテストされます。その特徴:同じホストでホストされているすべてのサブモジュールと、.gitmodules
相対URLのみが含まれています。
-- mkdir boost ; cd boost ; lua ../git-submodules-clone-HEAD.lua https://github.com/boostorg/boost.git .
local module_url = arg[1] or 'https://github.com/boostorg/boost.git'
local module = arg[2] or module_url:match('.+/([_%d%a]+)%.git')
local branch = arg[3] or 'master'
function execute(command)
print('# ' .. command)
return os.execute(command)
end
-- execute('rm -rf ' .. module)
if not execute('git clone --single-branch --branch master --depth=1 ' .. module_url .. ' ' .. module) then
io.stderr:write('can\'t clone repository from ' .. module_url .. ' to ' .. module .. '\n')
return 1
end
-- cd $module ; git submodule update --init --recursive --remote --no-fetch --depth=1
execute('mkdir -p ' .. module .. '/.git/modules')
assert(io.input(module .. '/.gitmodules'))
local lines = {}
for line in io.lines() do
table.insert(lines, line)
end
local submodule
local path
local submodule_url
for _, line in ipairs(lines) do
local submodule_ = line:match('^%[submodule %"([_%d%a]-)%"%]$')
if submodule_ then
submodule = submodule_
path = nil
submodule_url = nil
else
local path_ = line:match('^%s*path = (.+)$')
if path_ then
path = path_
else
submodule_url = line:match('^%s*url = (.+)$')
end
if submodule and path and submodule_url then
-- execute('rm -rf ' .. path)
local git_dir = module .. '/.git/modules/' .. path:match('^.-/(.+)$')
-- execute('rm -rf ' .. git_dir)
execute('mkdir -p $(dirname "' .. git_dir .. '")')
if not execute('git clone --depth=1 --single-branch --branch=' .. branch .. ' --separate-git-dir ' .. git_dir .. ' ' .. module_url .. '/' .. submodule_url .. ' ' .. module .. '/' .. path) then
io.stderr:write('can\'t clone submodule ' .. submodule .. '\n')
return 1
end
path = nil
submodule_url = nil
end
end
end