Get Appointment

  • contact@wellinor.com
  • +(123)-456-7890

Blog & Insights

WP_Query Object ( [query] => Array ( [post_type] => post [showposts] => 8 [orderby] => Array ( [date] => desc ) [autosort] => 0 [paged] => 0 [post__not_in] => Array ( [0] => 5233 ) ) [query_vars] => Array ( [post_type] => post [showposts] => 8 [orderby] => Array ( [date] => desc ) [autosort] => 0 [paged] => 0 [post__not_in] => Array ( [0] => 5233 ) [error] => [m] => [p] => 0 [post_parent] => [subpost] => [subpost_id] => [attachment] => [attachment_id] => 0 [name] => [pagename] => [page_id] => 0 [second] => [minute] => [hour] => [day] => 0 [monthnum] => 0 [year] => 0 [w] => 0 [category_name] => [tag] => [cat] => [tag_id] => [author] => [author_name] => [feed] => [tb] => [meta_key] => [meta_value] => [preview] => [s] => [sentence] => [title] => [fields] => all [menu_order] => [embed] => [category__in] => Array ( ) [category__not_in] => Array ( ) [category__and] => Array ( ) [post__in] => Array ( ) [post_name__in] => Array ( ) [tag__in] => Array ( ) [tag__not_in] => Array ( ) [tag__and] => Array ( ) [tag_slug__in] => Array ( ) [tag_slug__and] => Array ( ) [post_parent__in] => Array ( ) [post_parent__not_in] => Array ( ) [author__in] => Array ( ) [author__not_in] => Array ( ) [search_columns] => Array ( ) [ignore_sticky_posts] => [suppress_filters] => [cache_results] => 1 [update_post_term_cache] => 1 [update_menu_item_cache] => [lazy_load_term_meta] => 1 [update_post_meta_cache] => 1 [posts_per_page] => 8 [nopaging] => [comments_per_page] => 50 [no_found_rows] => [order] => DESC ) [tax_query] => WP_Tax_Query Object ( [queries] => Array ( ) [relation] => AND [table_aliases:protected] => Array ( ) [queried_terms] => Array ( ) [primary_table] => wp_posts [primary_id_column] => ID ) [meta_query] => WP_Meta_Query Object ( [queries] => Array ( ) [relation] => [meta_table] => [meta_id_column] => [primary_table] => [primary_id_column] => [table_aliases:protected] => Array ( ) [clauses:protected] => Array ( ) [has_or_relation:protected] => ) [date_query] => [request] => SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.ID NOT IN (5233) AND ((wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'expired' OR wp_posts.post_status = 'acf-disabled' OR wp_posts.post_status = 'tribe-ea-success' OR wp_posts.post_status = 'tribe-ea-failed' OR wp_posts.post_status = 'tribe-ea-schedule' OR wp_posts.post_status = 'tribe-ea-pending' OR wp_posts.post_status = 'tribe-ea-draft'))) ORDER BY wp_posts.post_date DESC LIMIT 0, 8 [posts] => Array ( [0] => WP_Post Object ( [ID] => 5324 [post_author] => 15 [post_date] => 2026-09-04 13:57:23 [post_date_gmt] => 2026-09-04 13:57:23 [post_content] =>

Keyva is pleased to announce the certification of the Keyva HP Universal CMDB Data Pump for the new ServiceNow Australia release. Clients can now seamlessly upgrade their ServiceNow App from previous ServiceNow releases (Zurich, Yokohama, Xanadu) to the Australia release.

The ServiceNow Australia release delivers enhanced AI-driven workflows, improved user experiences, and expanded automation capabilities to increase productivity, resilience, and service efficiency across the enterprise.

Keyva's HP Universal CMDB Data Pump provides synchronization of CIs, CI attributes, and relationships from the ServiceNow CMDB into the HP Universal CMDB. This integration allows organizations to leverage their existing investment in Enterprise Software and avoid costly "Rip and Replace" projects.

Learn more about the Keyva HP Universal CMDB Data Pump and view all the ServiceNow releases for which Keyva has been certified at the ServiceNow Store: store.servicenow.com.

[post_title] => Keyva HP Universal CMDB Data Pump Certified for Australia Release [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => keyva-hp-universal-cmdb-data-pump-certified-for-australia-release [to_ping] => [pinged] => [post_modified] => 2026-09-03 14:10:37 [post_modified_gmt] => 2026-09-03 14:10:37 [post_content_filtered] => [post_parent] => 0 [guid] => https://keyvatech.com/?p=5324 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) [1] => WP_Post Object ( [ID] => 5335 [post_author] => 15 [post_date] => 2026-09-03 14:09:35 [post_date_gmt] => 2026-09-03 14:09:35 [post_content] =>

Keyva is pleased to announce the certification of the Keyva VMware Orchestration for the new ServiceNow Australia release. Clients can now seamlessly upgrade their ServiceNow App from previous ServiceNow releases (Zurich, Yokohama, Xanadu) to the Australia release.

The ServiceNow Australia release delivers enhanced AI-driven workflows, improved user experiences, and expanded automation capabilities to increase productivity, resilience, and service efficiency across the enterprise.

Keyva's VMware Orchestration allows users to trigger VMware operations directly from ServiceNow Catalog Requests, Change Requests, Incident Requests, and more. Users have the flexibility to configure custom triggers and define specific conditions for launch, ensuring that any approvals established within ServiceNow are completed before the corresponding VMware operation is initiated. This integration allows organizations to fulfill infrastructure automation requests through VMware from a centralized ServiceNow service catalog, without requiring additional ServiceNow licensing.

Learn more about the Keyva VMware Orchestration and view all the ServiceNow releases for which Keyva has been certified at the ServiceNow Store: store.servicenow.com.

[post_title] => Keyva VMware Orchestration Certified for Australia Release [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => keyva-vmware-orchestration-certified-for-australia-release [to_ping] => [pinged] => [post_modified] => 2026-09-03 14:34:41 [post_modified_gmt] => 2026-09-03 14:34:41 [post_content_filtered] => [post_parent] => 0 [guid] => https://keyvatech.com/?p=5335 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) [2] => WP_Post Object ( [ID] => 5299 [post_author] => 15 [post_date] => 2026-09-02 14:11:08 [post_date_gmt] => 2026-09-02 14:11:08 [post_content] => Every one of the Sysbox install steps assumes the underlying node pool is already shaped correctly. It isn't, by default, and figuring that out the hard way costs more time than reading about it up front. Trying to troubleshoot a DaemonSet that keeps failing silently on nodes that is never going to work. The first surprise is the node image. GKE hands you Container Optimized OS by default, which is a reasonable choice for almost every other workload on the cluster. Sysbox needs Ubuntu though, and specifically a kernel at 5.4 or newer, which COS simply doesn't provide. So, the first real prerequisite isn't a Sysbox setting at all. It's provisioning a separate node pool that actually runs Ubuntu with containerd, using the UBUNTU_CONTAINERD image type, rather than assuming the default pool will work. Sizing is the second thing teams underestimate. A node running nested Docker daemons inside user namespaces needs genuine headroom, not the smallest instance that technically boots. Four vCPUs and 4GB of RAM per node is closer to a floor than a comfortable target, and going below it doesn't throw a clean error. It just shows up later as sandboxes that intermittently fail to start. Version alignment is where things get quietly wrong. Sysbox wants Kubernetes 1.32 or newer, running alongside containerd 2.0.5 or later. There's a specific range, containerd 2.0.1 through 2.0.4, carrying a bug that blocks pods from launching under any non-default runtime, Sysbox included. Land a node pool in that range and the installer falls back to deploying its own CRI-O runtime and switching the node over, which restarts kubelet and disrupts running pods for a minute or two. Survivable, but not something worth discovering by accident on a cluster other teams depend on. Pin the node pool version on purpose instead of letting a release channel decide for you. The last piece is scheduling. The Sysbox installer looks for a specific label, sysbox-install=yes, before it will touch a node, and in practice a taint is worth adding too, so nothing lands on that node except workloads that actually want Sysbox underneath them. Both belong in the same Terraform that provisions the pool, not in a kubectl command someone runs once during setup and never writes down again. Here's roughly what that node pool looks like in practice:
resource "google_container_node_pool" "sysbox_pool" {
  name       = "sysbox-nodes"
  cluster    = google_container_cluster.primary.name
  location   = google_container_cluster.primary.location
  node_count = 2
  version    = "1.32.4-gke.1236000"
 
  node_config {
    machine_type = "e2-standard-4"
    image_type   = "UBUNTU_CONTAINERD"
    disk_size_gb = 100
 
    labels = {
      "sysbox-install" = "yes"
    }
 
    taint {
      key    = "sysbox"
      value  = "true"
      effect = "NO_SCHEDULE"
    }
 
    oauth_scopes = [
      "https://www.googleapis.com/auth/cloud-platform"
    ]
  }
 
  management {
    auto_repair  = true
    auto_upgrade = false
  }
}
The image_type line does most of the real work here. Everything else is tuning around it. Get that node pool right and the rest of the install, labeling the node, applying the manifest, watching the DaemonSet come up healthy, turns into the straightforward part it's supposed to be. None of this is complicated once it's written down. It's just the kind of setup that stays invisible when done correctly and expensive when skipped, which is probably why it rarely gets more than a passing mention in the official documentation. [table id=3 /] [post_title] => Before You Install Sysbox, GKE Has to Be Ready For It [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => before-you-install-sysbox-gke-has-to-be-ready-for-it [to_ping] => [pinged] => [post_modified] => 2026-09-03 14:11:19 [post_modified_gmt] => 2026-09-03 14:11:19 [post_content_filtered] => [post_parent] => 0 [guid] => https://keyvatech.com/?p=5299 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) [3] => WP_Post Object ( [ID] => 5321 [post_author] => 15 [post_date] => 2026-09-01 13:54:37 [post_date_gmt] => 2026-09-01 13:54:37 [post_content] =>

Keyva is pleased to announce the certification of the Keyva Service Integration Hub for Red Hat Ansible Automation Platform for the new ServiceNow Australia release. Clients can now seamlessly upgrade their ServiceNow App from previous ServiceNow releases (Zurich, Yokohama, Xanadu) to the Australia release.

The ServiceNow Australia release delivers enhanced AI-driven workflows, improved user experiences, and expanded automation capabilities to increase productivity, resilience, and service efficiency across the enterprise.

Keyva's Service Integration Hub for Red Hat Ansible Automation Platform allows users to initiate and manage Ansible automation tasks directly from ServiceNow Catalog Requests, Change Requests, and more. Users have the flexibility to configure custom triggers and define specific conditions for launch, ensuring that any approvals established within ServiceNow are completed before the corresponding Ansible job is initiated. This integration allows organizations to fulfill IT automation requests through Ansible Automation Platform from a centralized ServiceNow service catalog, without requiring additional ServiceNow licensing.

Learn more about the Keyva Service Integration Hub for Red Hat Ansible Automation Platform and view all the ServiceNow releases for which Keyva has been certified at the ServiceNow Store: store.servicenow.com.

[post_title] => Keyva Service Integration Hub for Red Hat Ansible Automation Platform Certified for Australia Release [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => keyva-service-integration-hub-for-red-hat-ansible-automation-platform-certified-for-australia-release [to_ping] => [pinged] => [post_modified] => 2026-09-03 14:10:19 [post_modified_gmt] => 2026-09-03 14:10:19 [post_content_filtered] => [post_parent] => 0 [guid] => https://keyvatech.com/?p=5321 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) [4] => WP_Post Object ( [ID] => 5318 [post_author] => 15 [post_date] => 2026-08-29 13:54:15 [post_date_gmt] => 2026-08-29 13:54:15 [post_content] =>

Keyva is pleased to announce the certification of the Keyva Service Integration Hub for Red Hat OpenShift for the new ServiceNow Australia release. Clients can now seamlessly upgrade their ServiceNow App from previous ServiceNow releases (Zurich, Yokohama, Xanadu) to the Australia release.

The ServiceNow Australia release delivers enhanced AI-driven workflows, improved user experiences, and expanded automation capabilities to increase productivity, resilience, and service efficiency across the enterprise.

Keyva's Service Integration Hub for Red Hat OpenShift allows users to trigger Red Hat OpenShift build jobs directly from ServiceNow Catalog Requests, Change Requests, Incident Requests, and more. Users have the flexibility to configure custom triggers and define specific conditions for launch, ensuring that any approvals established within ServiceNow are completed before the corresponding OpenShift deployment job is initiated. This integration allows organizations to fulfill IT automation requests through OpenShift from a centralized ServiceNow service catalog, without requiring additional ServiceNow licensing.

Learn more about the Keyva Service Integration Hub for Red Hat OpenShift and view all the ServiceNow releases for which Keyva has been certified at the ServiceNow Store: store.servicenow.com.

[post_title] => Keyva Service Integration Hub for Red Hat OpenShift Certified for Australia Release [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => keyva-service-integration-hub-for-red-hat-openshift-certified-for-australia-release [to_ping] => [pinged] => [post_modified] => 2026-09-03 14:10:04 [post_modified_gmt] => 2026-09-03 14:10:04 [post_content_filtered] => [post_parent] => 0 [guid] => https://keyvatech.com/?p=5318 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) [5] => WP_Post Object ( [ID] => 5294 [post_author] => 15 [post_date] => 2026-08-27 20:09:42 [post_date_gmt] => 2026-08-27 20:09:42 [post_content] => Have you ever lost work because of an error done while using Git? Perhaps by deleting an unpushed branch by mistake, or having done a hard reset on the wrong repository? A destructive error could mean hours of reconstruction, unless you’re aware that Git has a feature meant for recovery from this sort of mistake. This feature is known as the reference log, or "reflog" for short. The reflog is your local record of where your branch pointer is, and where it has been in recent history. Every time a change to a branch pointer happens, Git remembers the position. It should be noted that the reflog is local to specific clones. Short of packing up the .git folder and sending it to a colleague, doing a recovery via the reflog needs to be done on the copy that the error was done on. So, what exactly does the reflog track, and what does it not? As mentioned, branch pointers are tracked, but so are remote tracking branch updates, HEAD movements and stashes. A list of common operations this includes are: Most importantly, what the reflog does not track are changes that were never staged or committed. The key takeaway for this being: stage/commit your code often; don’t allow large monolithic deltas to catch you off-guard.
Basic Operations
Interacting with the reference log is done via the `git reflog` command. Here is an example reflog output:
ebe1ad46f (HEAD -> dev, origin/dev) HEAD@{0}: commit: Build and Run on MacOS

3fb7c8ff4 HEAD@{1}: pull: Fast-forward

f9d877784 HEAD@{2}: commit: Fixing contrib dead linkage

372bbea2b HEAD@{3}: reset: moving to origin/dev

372bbea2b HEAD@{4}: checkout: moving from master to dev

3b6a7e870 (origin/master, origin/HEAD, master) HEAD@{5}: clone: from <repo URL>
Each entry shows, in order: Reference logs for specific branches can also be done:
$ git reflog show master

3b6a7e870 (origin/master, origin/HEAD, master) master@{0}: clone: from <repo URL>
As well as timestamps:
$ git reflog show master --relative-date # Also try --date=iso

3b6a7e870 (origin/master, origin/HEAD, master) master@{7 weeks ago}: clone: from <repo URL>
And even with patches displayed as part of the output:
$ git reflog show master --relative-date -p

3b6a7e870 (origin/master, origin/HEAD, master) master@{7 weeks ago}: clone: from <repo URL>

diff --git a/src/app/app.cpp b/src/app/app.cpp

index 7833fae15..6da32d596 100644

--- a/src/app/app.cpp

+++ b/src/app/app.cpp

@@ -33,7 +33,7 @@ static void SetCompleted(App *_app, bool &_) { App::s_isCompleted = _isCompleted; }
-App::Model *App::s_model = save::g_appFormatter.RegisterModel<App>(

+App::Model *App::s_model = save::ModelStorage::RegisterModel<App>(

APP_STRINGIFY(App),

save::AttributeAccess<&App::m_loadedSavefileVer,
Common scenarios
Now that we have some understanding of what we’re looking at with the reference log output, let’s go over some scenarios. Example 1: Accidental use of `reset --hard`:
$ git reset --hard HEAD~3

# Oops.
$ git reflog

8a91155e0 (HEAD -> dev) HEAD@{0}: reset: moving to HEAD~3

ebe1ad46f (origin/dev) HEAD@{1}: commit: Build and Run on MacOS

[...]

# Now we use the commit before the reset (ebe1ad46f HEAD@{1})
$ git reset --hard ebe1ad46f # using "HEAD@{1}" in place of the hash is also acceptable

And we have effectively undone a hard reset. Note that in doing this, the first hard reset (the 8a91155e0 hash) is still present in the reference log and is now the new HEAD@{1}.
Example 2: Lost commit from a rebase
$ git rebase -i HEAD~5

Successfully rebased and updated refs/heads/dev.

# We need that last commit, however...

$ git reflog

0d9cae3c1 (HEAD -> dev) HEAD@{0}: rebase (finish): returning to refs/heads/dev

0d9cae3c1 (HEAD -> dev) HEAD@{1}: rebase (start): checkout HEAD~5

ebe1ad46f (origin/dev) HEAD@{2}: commit: Build and Run on MacOS

# Now we can cherry-pick the hash of the needed commit

$ git cherry-pick ebe1ad46f


# Don’t forget to commit!
Example 3: Mistakenly deleted branch
$ git checkout master

M               .gitignore

M               .gitmodules

[...]

Switched to branch 'master'

Your branch is up to date with 'origin/master'.


$ git branch -D dev

Deleted branch dev.

# Oops again.

$ git reflog

3853c23ba (HEAD -> master, origin/master) HEAD@{0}: checkout: moving from dev to master

ebe1ad46f (origin/dev) HEAD@{1}: commit: Build and Run on MacOS

[...]

# We can recreate the branch in whole from the last state we saw that branch in

$ git checkout -b dev ebe1ad46f

M               .gitignore

M               .gitmodules

[...]

Switched to a new branch 'dev'
One Final Note
It is important to know that the reference log does not, by default, hold all history forever. Depending on the situation, entries will expire within 30 or 90 days. This behaviour can be changed via:
# You can also use "never" to keep everything or "now" to not keep a log (strongly discouraged)

# You can also make this affect all repos you use with --global

$ git config gc.reflogExpire 365.days
$ git config gc.reflogExpireUnreachable 90.days
Ultimately, the reference log serves well as a light in the dark, should things go wrong. These are some common examples, but most destructive operations short of deleting the .git folder can be recovered, from bad amends on commits to merges gone awry.
References and Additional Reading:
[table id=11 /] [post_title] => Gitting Good – Leveraging the Reference Log For Disaster Recovery [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => gitting-good-leveraging-the-reference-log-for-disaster-recovery [to_ping] => [pinged] => [post_modified] => 2026-08-27 20:10:16 [post_modified_gmt] => 2026-08-27 20:10:16 [post_content_filtered] => [post_parent] => 0 [guid] => https://keyvatech.com/?p=5294 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) [6] => WP_Post Object ( [ID] => 5289 [post_author] => 15 [post_date] => 2026-08-24 14:39:26 [post_date_gmt] => 2026-08-24 14:39:26 [post_content] => Have you ever worked on a project that required some sort of third-party dependency, and didn’t have the luxury of a mature package manager such as Python’s pip, JavaScript's npm or Rust’s cargo? Whatever the reason, be it use of a language that doesn’t have a standard package manager such as C++, or a specific internal repo not available as a package, Git has a feature to ease the pain of managing these external dependencies, known as submodules. At the core, the submodule system is a means of importing a specific commit into a project. These submodules are managed separately of the rest of the repository, and the only data pushed to your project is the information on how to fetch the submodule, rather than pushing the entire contents of a needed dependency.
Adding a submodule
Before adding a submodule to a project, consider mirroring the target repository to your own Git instance. If a target repository server goes down, then a fresh pull of your project will not be able to receive this code without some effort (see Gitting Good - How to Collaborate Without a Central Service for sample workarounds), so it’s better to be prepared ahead of time by having a regularly syncing mirror repository. Once this has been done, you can add your dependency as its only directory by using the git submodule feature:
# Adding a submodule at the default (master/main) branch’s HEAD

git submodule add https://git.keyva.internal/externals/openssl.git contribs/openssl

# Or, using '-b' to declare a specific branch to use

git submodule add -b openssl-3.6 https://git.keyva.internal/externals/openssl.git contribs/openssl
A new file named .gitmodules will be added to your project root the first time a submodule is added:
[submodule "contribs/openssl"]

path = contribs/openssl

url = gitea@https://git.keyva.internal/externals/openssl.git

branch = openssl-3.6
An entry in .git/config will also be created:
[submodule "contribs/openssl"]

active = true

url = gitea@https://git.keyva.internal/externals/openssl.git
Whenever a new submodule is added, the .gitmodules file should be committed to track that change. No other objects need to be added to the index.
Pulling submodules within a project
Cloning a project does not automatically also clone submodules within that project. Cloning submodules can be done in two main ways:
# At the time of cloning:
git clone --recurse-submodules https://git.keyva.internal/projects/test-app.git

# Or, if the project is already cloned:
git submodule update --init --recursive
The --recursive flag is used to handle nested submodules; that is to say: submodules of submodules.
Updating submodules
It is important to note that submodules track a specific commit, rather than a branch, though defining a branch as above will tell Git what branch the desired commit is in. For this reason, new updates to a submodule’s project are not automatically pulled in. The purpose of this is in part to ensure that a project’s state, that is to say each commit, remains consistent. Should it be needed to roll back to an earlier commit to check on prior behavior, that commit will point to the same commit of the submodules as when it was originally authored. Because of this, submodule updates are done with a different step from pulling the main repository:
# Update everything recursively
git submodule update --remote –recursive


# Commit the new updates after testing
git add contribs/*
Git commit –m "Update submodules"
Removing submodules
For the same reasons that updating submodules is a seperate process from the main repository, removing submodules also requires a different process to be "clean":
# Deinitialize
git submodule deinit -f -- contribs/openssl

# Remove from index and working tree
git rm -f contribs/openssl

# Remove metadata
rm -rf .git/modules/contribs/openssl

# Commit
git add .gitmodules
git commit -m "Removing openssl submodule"
Common issues
When within a submodule directory, you exist in what is effectively that submodule's project, and within a detached HEAD state of that project. If changes need to be made, a branch reference must be defined first:
# Get to the project directoy
cd contrib/openssl


# Checkout an existing branch
git checkout main 
# Or create a new one
git checkout –b keyva-dev


# Do whatever changes are needed, and then:

git push origin keyva-dev # Still in the submodule's directory


# Move back to main project directory
cd ../..

# Update the pointer for the submodule
git add contrib/openssl

# And then finally commit
git commit -m "Update submodule to latest"
Another somewhat common issue is changing the repository URL. This can be because a project owner changed where their repository is hosted, or maybe because you started with an external reository and now what to move to an internal, mirrored one. URLs can be updated first by editing the relevant area in .gitmodules, followed by running git submodule sync, which will update .git/config. Add .gitmodules to the index and commit once tested.
Common uses
As previously mentioned, the primary use case for submodules is importing external code to a project. However, this also makes it a good case for avoiding code reuse and drift. For instance, one C++ project I use internally handles common features such as architecture-specific handling, string utilities and special math handling. This project is used by all other end projects and, as a result of being included as a submodule, the code for it has a single source of truth. This means that code isn’t needlessly duplicated across projects, and behavior doesn’t drift between projects because one feature exists in one project but not others. Use of submodules is also a decent way to anchor commits. If a submodule’s repository frequently pushes breaking changes, declaring a specific commit as the one to be using is an easy solution, allowing updating to these submodules at one’s own pace, rather than being made to adjust to changes in the middle of another workflow. [table id=11 /] [post_title] => Gitting Good - Using Submodules to Manage Dependencies [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => gitting-good-using-submodules-to-manage-dependencies [to_ping] => [pinged] => [post_modified] => 2026-08-24 14:39:26 [post_modified_gmt] => 2026-08-24 14:39:26 [post_content_filtered] => [post_parent] => 0 [guid] => https://keyvatech.com/?p=5289 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) [7] => WP_Post Object ( [ID] => 5281 [post_author] => 15 [post_date] => 2026-08-13 13:22:46 [post_date_gmt] => 2026-08-13 13:22:46 [post_content] => Git has a feature to help hunt down bugs for a very specific sort of problem: when you have a regression, but you don't know when it was introduced. This feature, known as `bisect`, can assist is tracking down such an issue by running a binary search through a repository's history to find the exact commit that such a regression was introduced.
Basic setup
# To initialize
git bisect start

# Declaring the current commit as broken; a tag or commit hash can also be included if an earlier broken commit is already known
git bisect bad

# Declaring a specific tag as a working commit; specific commit hashes may again be used
git bisect good v1.2.0-release
At this point, Git will check out the commit at the midway point between the latest known working and earlier known not-working commits. From here, it is a simple matter to test the checked out commit and:
# If the checkout has the bug:
git bisect bad

# Or if it does not:
git bisect good

# Or, if there is something preventing testing with this specific commit:
git bisect skip
Every time a commit is determined to be good or bad, Git will automatically checkout the next "middle" commit to continue the process. In doing this, one can track down the commit that introduced the bug in O(log2(n)) steps, in addition to any skips done in the process. That means even with a thousand commits, it won't take more than 10 steps to reach an answer. Ten thousand commits? Not more than 14 steps.
Workflow Considerations
The bisect feature is at its best when commits are atomic; that is to say small and focused changes that affect one logical area at a time. One bug fix, or one feature, or one refactorization are all considered atomic. Bisect results are most useful when they land on a small commit, as a small diff will make it clearer as to why an undesirable change has happened. Squash commits should also be avoided for this reason, as they remove history and make multiple smaller commits into singular large ones. It’s also a good idea to not commit work-in-progress commits, or commits that don't pass needed tests. This is not always possible to avoid depending on the environment. If this is the case, it would be wise to start commit messages by saying so, e.g. with "[WIP]" or something equivalent, to indicate that the skip command should be used immediately.
Automation
Good practices with workflow can also allow for ease of automation. Having a test suite that can determine if a commit is good or not can assist greatly. This can be done via exit codes: This test need not be a part of the repo itself, so any new testing that needs to be done won't need to interfere with multiple checkouts. To start automated tests, we begin in much the same way:
git bisect start
git bisect bad
git bisect good v1.2.0-release

# To declare how to test automatically:
git bisect run ~/tests/run-test.sh # or wherever your script is
Tests can be done inline as well. This is useful for many functions, with perhaps the best example being scanning output for a specific message or message fragment:
git bisect run bash -c '/usr/bin/env python3 main.py arg1 arg2 | grep -q "ERROR"'
Finally, using worktree, a specific current and committed test suite can also be defined, allowing checkouts of running code while leaving the most current tests intact:
git worktree add ../bisect-tests HEAD
git bisect run ../bisect-tests/tests/run.sh
Other uses
Finding the point of origin of bugs isn't the end of utility for Git bisect. Using other available scripts, one can use bisect to find performance issues. Some additional things that can be done include: Bisect works well as a general purpose tool for determining when and where a change happened. The only requirement is that it is something testable with a script that can return a pass/fail response. Official Documentation: https://git-scm.com/docs/git-bisect. [table id=11 /] [post_title] => Gitting Good - Using Bisect - Git's Built-in Debugging Tool [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => gitting-good-using-bisect-gits-built-in-debugging-tool [to_ping] => [pinged] => [post_modified] => 2026-08-13 14:06:04 [post_modified_gmt] => 2026-08-13 14:06:04 [post_content_filtered] => [post_parent] => 0 [guid] => https://keyvatech.com/?p=5281 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) ) [post_count] => 8 [current_post] => -1 [before_loop] => 1 [in_the_loop] => [post] => WP_Post Object ( [ID] => 5324 [post_author] => 15 [post_date] => 2026-09-04 13:57:23 [post_date_gmt] => 2026-09-04 13:57:23 [post_content] =>

Keyva is pleased to announce the certification of the Keyva HP Universal CMDB Data Pump for the new ServiceNow Australia release. Clients can now seamlessly upgrade their ServiceNow App from previous ServiceNow releases (Zurich, Yokohama, Xanadu) to the Australia release.

The ServiceNow Australia release delivers enhanced AI-driven workflows, improved user experiences, and expanded automation capabilities to increase productivity, resilience, and service efficiency across the enterprise.

Keyva's HP Universal CMDB Data Pump provides synchronization of CIs, CI attributes, and relationships from the ServiceNow CMDB into the HP Universal CMDB. This integration allows organizations to leverage their existing investment in Enterprise Software and avoid costly "Rip and Replace" projects.

Learn more about the Keyva HP Universal CMDB Data Pump and view all the ServiceNow releases for which Keyva has been certified at the ServiceNow Store: store.servicenow.com.

[post_title] => Keyva HP Universal CMDB Data Pump Certified for Australia Release [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => keyva-hp-universal-cmdb-data-pump-certified-for-australia-release [to_ping] => [pinged] => [post_modified] => 2026-09-03 14:10:37 [post_modified_gmt] => 2026-09-03 14:10:37 [post_content_filtered] => [post_parent] => 0 [guid] => https://keyvatech.com/?p=5324 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) [comment_count] => 0 [current_comment] => -1 [found_posts] => 169 [max_num_pages] => 22 [max_num_comment_pages] => 0 [is_single] => [is_preview] => [is_page] => [is_archive] => [is_date] => [is_year] => [is_month] => [is_day] => [is_time] => [is_author] => [is_category] => [is_tag] => [is_tax] => [is_search] => [is_feed] => [is_comment_feed] => [is_trackback] => [is_home] => 1 [is_privacy_policy] => [is_404] => [is_embed] => [is_paged] => [is_admin] => [is_attachment] => [is_singular] => [is_robots] => [is_favicon] => [is_posts_page] => [is_post_type_archive] => [query_vars_hash:WP_Query:private] => c0ac5b645bca5e8a351ed08806ccbf53 [query_vars_changed:WP_Query:private] => [thumbnails_cached] => [allow_query_attachment_by_filename:protected] => [stopwords:WP_Query:private] => [compat_fields:WP_Query:private] => Array ( [0] => query_vars_hash [1] => query_vars_changed ) [compat_methods:WP_Query:private] => Array ( [0] => init_query_flags [1] => parse_tax_query ) [query_cache_key:WP_Query:private] => wp_query:cb46a272b3f31498c88060117c9a6915 [tribe_is_event] => [tribe_is_multi_posttype] => [tribe_is_event_category] => [tribe_is_event_venue] => [tribe_is_event_organizer] => [tribe_is_event_query] => [tribe_is_past] => )

Keyva HP Universal CMDB Data Pump Certified for Australia Release

Keyva is pleased to announce the certification of the Keyva HP Universal CMDB Data Pump for the new ServiceNow Australia release. Clients can now seamlessly upgrade their ServiceNow App from ...

Keyva VMware Orchestration Certified for Australia Release

Keyva is pleased to announce the certification of the Keyva VMware Orchestration for the new ServiceNow Australia release. Clients can now seamlessly upgrade their ServiceNow App from previous ServiceNow releases ...

Before You Install Sysbox, GKE Has to Be Ready For It

Every one of the Sysbox install steps assumes the underlying node pool is already shaped correctly. It isn’t, by default, and figuring that out the hard way costs more time ...

Keyva Service Integration Hub for Red Hat Ansible Automation Platform Certified for Australia Release

Keyva is pleased to announce the certification of the Keyva Service Integration Hub for Red Hat Ansible Automation Platform for the new ServiceNow Australia release. Clients can now seamlessly upgrade ...

Keyva Service Integration Hub for Red Hat OpenShift Certified for Australia Release

Keyva is pleased to announce the certification of the Keyva Service Integration Hub for Red Hat OpenShift for the new ServiceNow Australia release. Clients can now seamlessly upgrade their ServiceNow ...

Gitting Good – Leveraging the Reference Log For Disaster Recovery

Have you ever lost work because of an error done while using Git? Perhaps by deleting an unpushed branch by mistake, or having done a hard reset on the wrong ...

Gitting Good – Using Submodules to Manage Dependencies

Have you ever worked on a project that required some sort of third-party dependency, and didn’t have the luxury of a mature package manager such as Python’s pip, JavaScript’s npm ...

Gitting Good – Using Bisect – Git’s Built-in Debugging Tool

Git has a feature to help hunt down bugs for a very specific sort of problem: when you have a regression, but you don’t know when it was introduced. This ...