What will be the alternative for repo sync command?

喜你入骨 提交于 2020-04-11 02:17:09

问题


I am new to git and I want to execute manifest file manually after doing repo init, instead of doing repo sync. To measure the time difference between normal git commands and repo sync in different cases. But I am not sure which git command to does repo uses.

I know that repo is just an wrapper for git for large codebase.

I just want to know what will be the exact command for git clone If I have the following Variables.

- name - path - revision - upstream - remote

I know how to form a url for git clone but not sure about revision and upstream.


回答1:


Here's a sample manifest 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>

Create a parent directory for testing

mkdir repotest
cd repotest

Create a git repository for the manifest

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

Download the repo tool

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

Init based on the local manifest

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

Modify source code of repo to get more debugging output (in addition to --trace and GIT_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

Sync

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

Filter the log

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

Filtered Log shows the sequence of git commands being executed

  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

Now that's a lot of commands. (Observation: repo uses curl to download the repositories).

As suggested by User ElpieKay, for the above manifest file, an approximation of git commands would be:

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

To compare the performance of the repo tool and git, you can do :

# 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

or using time command to get the total execution time of the git commands

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

Note: remote has an attribute fetch whose value is the url prefix of the server. The prefix and name form the actual url to the remote repository - User ElpieKay

More on the Debugging Variables used in git:

GIT_TRACE_PERFORMANCE

controls logging of performance data. The output shows how long each particular git invocation takes.

GIT_TRACE

controls general traces, which don’t fit into any specific category. This includes the expansion of aliases, and delegation to other sub-programs.



来源:https://stackoverflow.com/questions/59463893/what-will-be-the-alternative-for-repo-sync-command

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!