repo sync命令的替代方法是什么?

时间:2019-12-24 04:38:43

标签: git android-manifest repo

我是git的新手,我想在执行repo init之后手动执行清单文件,而不是执行repo sync。在不同情况下测量普通git命令和repo sync之间的时间差。但是我不确定要使用哪个git命令进行回购。

我知道repo只是大型代码库的git包装。

如果我具有以下变量,我只想知道git clone的确切命令是什么。

-名称  -路径  -修订  - 上游的  -远程

我知道如何为git clone形成一个url,但是不确定版本和上游。

1 个答案:

答案 0 :(得分:4)

这是一个清单清单default.xml

<manifest>
        <remote  name="aosp"
               fetch="https://android.googlesource.com/"/>
        <remote  name="test"
               fetch="https://github.com/test/"/>
        <default revision="master"
               remote="test"
               sync-j="4" />
        <project name="platform/tools/motodev" path="tools/motodev" revision="69989786cefbde82527960a1e100ec9afba46a98" upstream="master" remote="aosp"/>
</manifest>

创建用于测试的父目录

mkdir repotest
cd repotest

为清单创建git存储库

mkdir local_manifest
cd local_manifest
git init
# Create the default.xml file
git add default.xml
git commit -m "Local Manifest"
cd ..

Download repo工具

mkdir -p .bin
PATH="${HOME}/repotest/.bin:${PATH}"
curl https://storage.googleapis.com/git-repo-downloads/repo > .bin/repo
chmod a+rx .bin/repo

基于本地清单的初始化

mkdir test
cd test
repo init -u ~/repotest/local_manifest/

修改repo的源代码以获取更多调试输出(除了--traceGIT_TRACE=1之外)

nano .repo/repo/git_command.py
# Remove stderr argument from the subprocess.Popen call (line no: ~292)
# Also comment the line at line no: ~331 which includes the use of the above removed argument stderr
# Save the file and exit

同步

export GIT_TRACE=1
repo --trace sync &> ../log
cd ..

过滤日志

grep "built-in:\|curl\|export" < log > temp
awk -F '[0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9]+ git.c:' '{print $1}' > trim1 < temp
awk -F 'trace: built-in:' '{print $2}' > trim2 < temp
paste -d' ' trim1 trim2 > filtered_log

过滤日志显示了正在执行的git命令的顺序

  git version
  git describe HEAD
  git config --file /home/test/repotest/test/.repo/manifests.git/config --null --list
  git config --file /home/test/repotest/test/.repo/repo/.git/config --null --list
: export GIT_DIR=/home/test/repotest/test/.repo/manifests.git 
  git fetch origin --tags '+refs/tags/*:refs/tags/*' '+refs/heads/*:refs/remotes/origin/*' +refs/heads/master:refs/remotes/origin/master
  git upload-pack /home/test/repotest/local_manifest/
  git rev-list --objects --stdin --not --all --quiet --alternate-refs
  git gc --auto
  git symbolic-ref -m 'manifest set to refs/heads/master' refs/remotes/m/master refs/remotes/origin/master
: export GIT_DIR=/home/test/repotest/test/.repo/project-objects/platform/tools/motodev.git 
  git init
  git config --file /home/test/repotest/test/.repo/projects/tools/motodev.git/config --null --list
  git config --file /home/test/repotest/test/.repo/projects/tools/motodev.git/config --replace-all filter.lfs.smudge 'git-lfs smudge --skip -- %f'
  git config --file /home/test/repotest/test/.repo/projects/tools/motodev.git/config --replace-all filter.lfs.process 'git-lfs filter-process --skip'
  git config --file /home/test/repotest/test/.repo/projects/tools/motodev.git/config --unset-all core.bare
  git config --file /home/test/repotest/test/.repo/projects/tools/motodev.git/config --replace-all remote.aosp.url https://android.googlesource.com/platform/tools/motodev
  git config --file /home/test/repotest/test/.repo/projects/tools/motodev.git/config --replace-all remote.aosp.projectname platform/tools/motodev
  git config --file /home/test/repotest/test/.repo/projects/tools/motodev.git/config --replace-all remote.aosp.fetch '+refs/heads/*:refs/remotes/aosp/*'
curl --fail --output /home/test/repotest/test/.repo/projects/tools/motodev.git/clone.bundle.tmp --netrc --location https://android.googlesource.com/platform/tools/motodev/clone.bundle 
: export GIT_DIR=/home/test/repotest/test/.repo/projects/tools/motodev.git 
  git fetch /home/test/repotest/test/.repo/projects/tools/motodev.git/clone.bundle '+refs/heads/*:refs/remotes/aosp/*' '+refs/tags/*:refs/tags/*'
  git index-pack --fix-thin --stdin
  git rev-list --objects --stdin --not --all --quiet --alternate-refs
  git gc --auto
  git fetch aosp --tags '+refs/tags/*:refs/tags/*' '+refs/heads/*:refs/remotes/aosp/*' +refs/heads/master:refs/remotes/aosp/master
  git fetch-pack --stateless-rpc --stdin --lock-pack --thin --no-progress https://android.googlesource.com/platform/tools/motodev/
  git unpack-objects -q --pack_header=2,2
  git rev-list --objects --stdin --not --all --quiet --alternate-refs
  git gc --auto
  git update-ref -m 'manifest set to 69989786cefbde82527960a1e100ec9afba46a98' --no-deref refs/remotes/m/master 69989786cefbde82527960a1e100ec9afba46a98^0
  git gc --auto
  git read-tree --reset -u -v HEAD

现在有很多命令。 (观察:repo使用curl下载存储库。)

根据用户ElpieKay的建议,对于上述清单文件,git命令的近似值为:

git clone https://android.googlesource.com/platform/tools/motodev -b master -- tools/motodev 
cd tools/motodev
git checkout 69989786cefbde82527960a1e100ec9afba46a98

要比较repo工具和git的性能,可以执行以下操作:

# For repo tool
repo --time sync
# For git commands
export GIT_TRACE_PERFORMANCE=1
git clone $remote -b $upstream -- $path 
cd $path 
git checkout $revision

或使用time命令获取git命令的总执行时间

time -p sh -c 'git clone $remote -b $upstream -- $path ; cd $path ; git checkout $revision'

注意:远程具有访存属性,其值是服务器的URL前缀。前缀和名称构成了远程存储库的实际URL-用户ElpieKay

有关git中使用的Debugging Variables的更多信息:

GIT_TRACE_PERFORMANCE

控制性能数据的记录。输出 显示每个特定的git调用需要多长时间。

GIT_TRACE

控制常规跟踪,这些跟踪不属于任何特定类别。 这包括扩展别名,以及将其委托给其他人。 子程序。